【发布时间】:2019-03-23 18:51:41
【问题描述】:
我有一个巨大的表,有 5 亿条记录。我必须根据 4 个属性将此表分成组(分区)。
如果日期差异大于或等于 7 天,我必须在每个组中选择(设置标志)最新记录和后续记录(从 7 天期间选择最新条目)。
我认为表格太大,无法对其进行计算。我应该把它分成几个较小的吗?但是一组的所有记录都必须在同一个表中。
有没有办法只使用 SQL 来指定适当的记录(不将其提取到 PL/SQL 数组中)?这是一次性操作。
你知道如何解决这个问题吗?
示例(一组 - 属性和日期 dd-mm-yyyy 格式):
- [A1 A2 A3 A4] 08-05-2018(标志 1 - 最新的)
- [A1 A2 A3 A4] 06-05-2018(标志 0 - 差异小于 7 天)
- [A1 A2 A3 A4] 01-05-2018(标志 1 - 差异更大/等于 7 天)
- [A1 A2 A3 A4] 30-04-2018(标志 0 - 差异小于 7 天 - 相对于记录 3)
- [A1 A2 A3 A4] 10-04-2018(标志 1 - 差异更大/等于 7 天 - 相对于记录 3)
【问题讨论】:
-
因此,对于每个键,我查看最新记录并将其标记为 1。然后我查找该键的第一条记录,该记录至少早 7 天,并将其标记为 1。然后我将此记录date 并再次查找该密钥的第一个记录,该记录至少早 7 天,并将其标记为 1。依此类推。 (所有其他记录都标记为 0。)是吗?
-
预期的结果是什么?使用正确标志更新了所有 5 亿条记录的表?还是仅显示 5 亿条记录的查询结果,每条记录都带有计算的标志?显示所有标记为 1 的行的查询结果?
-
@ThorstenKettner - 正是您的第一条评论的情况。结果 - 使用正确的标志更新源表。
-
因此您需要读取整个表,按顺序扫描并更新每条记录。我会为此编写一个 PL/SQL 函数,在其中循环所有记录。如果您希望大多数记录必须标记为 0,那么您可能希望先对标记 0 进行完整更新,然后在循环中只更新单个记录为 1。
-
@ThorstenKettner 试图只考虑 SQL 查询,但似乎你是对的 - PL/SQL 函数将是必要的......谢谢
标签: sql database oracle performance plsql