我有一张大桌子,有5亿张唱片。我必须根据4个属性将这个表划分为组(分区)。
在每个组中,如果日期的差异大于或等于7天,我必须选择(设置标志)最新记录和后续记录(选择7天期间的最新条目)。
我认为这张桌子太大了,无法计算。我应该把它分成几个小的吗?但一组的所有记录都必须放在同一张桌子上。
是否有任何方法仅使用SQL指定适当的记录(而不将其获取到PL/SQL数组)?这是一次性的行动。
你知道如何解决这个问题吗?
示例(一个组属性和日期dd yyyy格式):
发布于 2018-10-19 04:27:37
由于您需要将表转换为分区,但只保留日期差大于7的记录和以前的记录,如果可能的话,我建议您尽可能删除不需要的记录。
您需要比较相邻的行,因此可以使用lag()
或lead()
函数。
https://oracle-base.com/articles/misc/lag-lead-analytic-functions
我认为以下查询可能会有所帮助:
SELECT pk, A1, A2, A3, A4, a_date
FROM (SELECT PK, A1, A2, A3, A4, a_date,
LAG (a_date, 1, 0) OVER (ORDER BY A1, A2, A3, A4, a_date DESC) AS date_prev,
a_date - LAG (a_date, 1, 0) OVER (ORDER BY A1, A2, A3, A4, a_date DESC) AS date_diff
FROM tbl1)
WHERE date_diff < 7
这些是你可以删除的记录。
然后,可以根据表的结构创建基于分区表列表的分区,然后在select中插入。
https://stackoverflow.com/questions/52882881
复制相似问题