选择具有相同 SSN 和 MAX 处理日期 DB2 的用户

问题描述 投票:0回答:3

我需要帮助编写执行此操作的查询。我需要找到所有具有 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

有什么优化查询的建议吗?

sql db2 subquery
3个回答
1
投票

在处理之前,您将整个表拖到临时空间中。 相反,执行子查询以通过 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

如果你有数百万人且互动相对较少,这可能仍然会失败。但我怀疑子查询将归结为适合您的临时空间的较小大小。


0
投票

也试试

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)上的查询性能索引非常有用。


0
投票

假设/理解:

  • 基于OP的预期输出,我猜测
    1st row / top 1 row
    指的是具有最小代码的行,即
    min(code)
  • 由于 OP 环境中的资源问题,我们需要远离窗口函数
  • OP 的示例输入显示 3 个不同的
    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 预期输出相同的顺序生成输出
  • 我假设OP的表有一个索引来支持这个查询,例如,
    (SSN, PROCESS_DATE [, CODE])
  • 我无法访问
    DB2
    数据库,因此我在
    Sybase ASE
    实例中对此进行了测试;这是相当基本的 SQL,所以我猜测/希望这应该没有语法问题
  • 在我的测试数据库中,我使用了
    datetime
    money
    数据类型;我 a) 遗漏了一些重新格式化代码,并且 b) 擅自调整最终输出中的间距,以便使其看起来像 OP 的输出
© www.soinside.com 2019 - 2024. All rights reserved.