从一个巨大的表格(4000万条记录)中插入最新的3条记录,其中包含不同年份的数据

Insert latest 3 records from a huge table(40 million records) which has data from different years

提问人:swapna 提问时间:11/17/2023 最后编辑:marc_sswapna 更新时间:11/17/2023 访问量:26

问:

我有如下数据..这只是一个示例数据,但每年有超过 1000 万条记录,我们可以一次将其插入到下表中的另一个表格中

Id name date
------------------
1  a    2018-01-01
2  b    2018-02-01
3  a    2018-6-01
4  a    2018-07-01
5  a    2018-10-01

6  a    2019-01-01
7  b    2019-02-01
8  a    2019-6-01
9  a    2019-07-01
10 a    2019-10-01
11 a    2020-01-01
12 b    2020-02-01
13 a    2020-6-01
14 a    2020-07-01
15 a    2020-10-01

尝试了许多方法,因为数据是巨大的,我们只需要这些年来的 3 条最新记录;使用 SQL 查询无法从如此大量的数据中获取数据。

预期输出:

Id  name date
----------------
15  a    2020-10-01
14  a    2020-07-01
13  a    2020-6-01

7   b    2019-02-01
2   b    2018-02-01
SQL 插入 动态查询增量

评论

1赞 Adrian Maxwell 11/17/2023
为了您的缘故,请告诉我们您使用的数据库!“SQL”在数据库供应商之间有很大差异 - 所以快速获得答案,使用您可以使用的语法,编辑标签并选择一个代表您的数据库的标签,例如MySQL,Postgres,SQL Server,Oracle等(不要反向选择多个 - 这同样糟糕。
0赞 Adrian Maxwell 11/17/2023
要设置文本表格的格式,只需将每行缩进 4 个字符即可。工具栏中有一个图标也可以执行此操作。有关格式设置的帮助,请参阅网站帮助(在脚注中)。{}
1赞 Error_2646 11/17/2023
提供实际数据库的另一个原因,尤其是在这样的情况下,表的属性(如索引或分区)可能会产生影响。这些将因数据库而异。这是你只是想工作一次,还是你必须定期运行它?如果 ID 在最近一天有多条记录,领带怎么办?

答:

2赞 Adrian Maxwell 11/17/2023 #1

此查询应在大多数 SQL 兼容数据库的最新版本中运行。

select 
  Id
, name
, "date"
from (
    select 
      Id
    , name
    , "date"
    , row_number() over(partition by name order by "date" DESC) as row_num
    from your_table
    ) d
where row_num <= 3

该函数只是提供一组从 1 开始的整数,这发生在每个整数中(这里每个名称将从 1 开始),并且给定 1 的特定行由 (这里我们按降序日期排序,所以最近的是 1,下一个是 2,下一个是 3 等)row_number()partitionorder by

如果不可用,请告知使用哪种数据库类型和版本。row_number()

“date”在某些 SQL 实现中是一个保留字,因此为了安全起见,您可能需要引用该列名。

另请注意,无论如何,因为您想要“最新的 3 行”和“每个名称”,因此无法避免对 ~4000 万行进行排序。如果您需要定期执行此操作,那么适合此查询的索引可能是值得的,例如

在 your_table(name, “date” DESC) 上创建索引idx_your_table_name_date;

但是,您需要测试它是否真的有帮助,或者索引是否减慢了插入速度。