我需要帮助编写执行此操作的查询。我需要找到所有具有 MAX Process 日期的用户。所以在数据库中,经常会有同一个人但处理日期不同的多条记录。 我需要在过滤后获取每个 ssn 的 TOP 1 记录以及最大处理日期。
PROCESS_DATE | SSN | Amount | CODE | SOURCE | TRADE_DATE | SHARECOST
11/12/2024 | 00-47-0004 | 111.11 | 1 | 1 | 12/10/2024 | 20.07
11/11/2024 | 00-47-0004 | 22.2 | 2 | 2 | 10/10/2024 | 20.07
11/12/2024 | 00-47-0004 | 0.00 | 13 | 1 | 11/10/2024 | 20.07
11/10/2024 | 00-45-0042 | 0.00 | 2 | 1 | 12/10/2024 | 20.07
11/09/2024 | 00-45-0012 | 7.77 | 5 | 2 | 12/10/2024 | 20.07
我使用带有最大处理日期的子查询,通过 SSN 和处理日期获取 row_number(),然后选择第一行。 预计
PROCESS_DATE | SSN | Amount | CODE| SOURCE | TRADE_DATE | SHARECOST
11/12/2024 | 00-47-0004 | 111.11 | 1 |1 |12/10/2024 |20.07
11/10/2024 | 00-45-0042 | 0.00 | 2 |1 |12/10/2024 |20.07
但是当记录大小超过一百万时,此查询会失败。 当前查询
SELECT SSN,
PROCESS_DATE,
AMOUNT,
CODE, SOURCE,TRADE_DATE,SHARECOST
FROM ( SELECT SSN,
PROCESS_DATE,
AMOUNT,
CODE, SOURCE,TRADE_DATE,SHARECOST
ROW_NUMBER() OVER (PARTITION SSN ORDER BY PROCESS_DATE) AS RN
FROM TABLE
) AS RANK
WHERE RN = 1 ORDER BY SSN;
执行需要很长时间并且失败
资源错误 SQL ERROR 57011 执行失败 资源不可用,原因 00C90305
有什么优化查询的建议吗?
在处理之前,您将整个表拖到临时空间中。 相反,执行子查询以通过 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
如果你有数百万人且互动相对较少,这可能仍然会失败。但我怀疑子查询将归结为适合您的临时空间的较小大小。
也试试
select *
from myTable t1
where t1.process_date=(
select process_date from myTable t2
where t2.ssn=t1.ssn
order by process_date desc
fetch first 1 row only
)
我认为,对于(ssn,process_date)上的查询性能索引非常有用。
假设/理解:
1st row / top 1 row
指的是具有最小代码的行,即min(code)
ssn
值,但预期输出仅显示其中两个 ssn
值;此时我猜测 a) 输入中存在拼写错误或 b) OP 意外地在预期输出中遗漏了一行向 OP 的示例输入添加一行:
insert TABLE_X values ('11/12/2024','00-47-0004',111.11,1)
insert TABLE_X values ('11/11/2024','00-47-0004', 22.20,2)
insert TABLE_X values ('11/12/2024','00-47-0004', 0.00,13)
insert TABLE_X values ('11/10/2024','00-45-0042', 0.00,2)
insert TABLE_X values ('11/01/2024','00-45-0042', 23.19,7)
insert TABLE_X values ('11/09/2024','00-45-0012', 7.77,5)
一个想法:
select t1.PROCESS_DATE,
t1.SSN,
t1.AMOUNT,
t1.CODE
from TABLE_X t1
join (select t2.SSN,
max(t2.PROCESS_DATE) max_date
from TABLE_X t2
group by t2.SSN) as dt
on t1.SSN = dt.SSN
and t1.PROCESS_DATE = dt.max_date
where t1.CODE = (select min(t3.CODE)
from TABLE_X t3
where t3.SSN = dt.SSN
and t3.PROCESS_DATE = dt.max_date)
order by t1.SSN desc
这会生成:
PROCESS_DATE SSN AMOUNT CODE
------------ ---------- ------ ----
11/12/2024 00-47-0004 111.11 1
11/10/2024 00-45-0042 0.00 2
11/09/2024 00-45-0012 7.77 5
注意事项:
order by
以确保我以与 OP 预期输出相同的顺序生成输出(SSN, PROCESS_DATE [, CODE])
DB2
数据库,因此我在 Sybase ASE
实例中对此进行了测试;这是相当基本的 SQL,所以我猜测/希望这应该没有语法问题datetime
和 money
数据类型;我 a) 遗漏了一些重新格式化代码,并且 b) 擅自调整最终输出中的间距,以便使其看起来像 OP 的输出