我需要帮助编写执行此操作的查询。我需要找到所有具有 MAX Process 日期的用户。所以在数据库中,经常会有同一个人但处理日期不同的多条记录。 我需要为每个 ssn 获取 1 条具有最大处理日期的记录。
PROCESS_DATE | SSN | Amount | CODE
11/12/2024 | 00-47-0004 | 111.11 | 1
11/11/2024 | 00-47-0004 | 22.2 | 2
11/12/2024 | 00-47-0004 | 0.00 | 13
11/10/2024 | 00-45-0042 | 0.00 | 2
11/09/2024 | 00-45-0012 | 7.77 | 5
我使用带有最大处理日期的子查询,通过 SSN 和处理日期获取 row_number(),然后选择第一行。 预计
PROCESS_DATE | SSN | Amount | CODE
11/12/2024 | 00-47-0004 | 111.11 | 1
11/10/2024 | 00-45-0042 | 0.00 | 2
但是当记录大小超过一百万时,此查询会失败。 当前查询
SELECT SSN,
PROCESS_DATE,
AMOUNT,
CODE
FROM ( SELECT SSN,
PROCESS_DATE,
AMOUNT,
CODE,
ROW_NUMBER() OVER (PARTITION SSN ORDER BY PROCESS_DATE) AS RN FROM TABLE
) AS RANK
WHERE RN = 1 ORDER BY SSN;
有什么优化查询的建议吗?
在处理之前,您将整个表拖到临时空间中。 相反,执行子查询以通过 SSN 获取最大日期,然后使用它来过滤您的表。
Select mytable.*
From mytable inner join
(Select SSN, max(Process_Date) as last
From mytable
Group by SSN) filter
On mytable.SSN=filter.SSN and
mytable.Process_Date=filter.last
如果您有数百万人且互动相对较少,这可能仍然会失败。但我怀疑子查询将归结为适合您的临时空间的较小大小。