提问人:swapna 提问时间:11/17/2023 最后编辑:marc_sswapna 更新时间:11/17/2023 访问量:26
从一个巨大的表格(4000万条记录)中插入最新的3条记录,其中包含不同年份的数据
Insert latest 3 records from a huge table(40 million records) which has data from different years
问:
我有如下数据..这只是一个示例数据,但每年有超过 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
答:
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()
partition
order by
如果不可用,请告知使用哪种数据库类型和版本。row_number()
铌“date”在某些 SQL 实现中是一个保留字,因此为了安全起见,您可能需要引用该列名。
另请注意,无论如何,因为您想要“最新的 3 行”和“每个名称”,因此无法避免对 ~4000 万行进行排序。如果您需要定期执行此操作,那么适合此查询的索引可能是值得的,例如
在 your_table(name, “date” DESC) 上创建索引idx_your_table_name_date;
但是,您需要测试它是否真的有帮助,或者索引是否减慢了插入速度。
评论
{}