DeL*_*eLL 2 db2 greatest-n-per-group
我整个 2 周都在尝试这样做,但似乎无济于事。这里涉及 3 个表。但我期待结果将是不同的情况下。对于同一日期和用户。否则,它必须全部返回。
SELECT DISTINCT A.CASENO,A.DATE,A.TIME,A.TRANNO,B.PCODE,C.PDESC,A.USER
FROM tableA A
RIGHT JOIN tableB B ON A.CASENO=B.CASENO
RIGHT JOIN tableC C ON C.PCODE=B.PCODE
WHERE A.DATE between 140124 and 140331
Run Code Online (Sandbox Code Playgroud)
结果仍然有重复,因为时间和 tranno 不同。查看 CASENO 上的结果。= 08088040
A.CASENO A.DATE A.TIME A.TRANNO B.PCODE C.PDESC A.USER
08088040 140124 182516 321 TYQ PREPLAN1 ANTHONY
08088040 140124 182131 318 TYQ PREPLAN1 ANTHONY
36360569 140128 111056 431 CVB POSTT1 MARIA
36360569 140310 113221 433 CVB POSTT1 MARIA
37386911 140213 150240 230 M2P PLANAVG FELISE
37386911 140213 135220 223 M2P PLANAVG HECTOR
39222881 140128 94122 104 TYQ PREPLAN1 ELLA
40895213 140213 164409 104 CVB POSTT1 WINNIE
51311866 140124 103203 319 M2P PLANAVG BRATT
Run Code Online (Sandbox Code Playgroud)
对于相同的日期,相同的用户和相同的 pcode 和 pdesc,caseno。08088040因为时间和tranno的不同出现了两次。这里的 max tranno 将指示在同一个案例号上完成的最新交易。最大时间还显示为该特定案例完成的最新日期时间操作。于 24/01/2014 @ 18:25:16。对于相同的日期和用户,我只想要最新的交易明细。
我已经尝试将下面的脚本添加为第一个条件,但结果为 0。在我获得输出之前,它也导致了长时间的延迟。
WHERE A.TRANNO=(SELECT MAX(TRANNO) FROM tableA A where A.CASENO=B.CASENO)
Run Code Online (Sandbox Code Playgroud)
仅供参考,其余的,例如。个案编号 由于不同的用户,37386911 被认为是唯一的,所以我希望将其返回。同时,第36360569号案件也是唯一的记录,因为日期不同。虽然是同一个用户。
那么,我应该如何实现这一目标?我发现的许多示例仅显示了 1 个表和 1 个标准以获得不同的值。
该脚本应该是用于 SQL DB2 的脚本。我实际上根本没有 SQL 背景。我之前所做的大部分查询都是基于反复试验,但由于没有像这样复杂的条件,所以它是成功的。
希望这里的专家可以分享知识。
这是一个典型的“每组最大 N”问题,通常使用窗口函数解决:
select caseno, date, time, tranno, pcode, pdesc, user
from (
select a.caseno,a.date,a.time,a.tranno,b.pcode,c.pdesc,a.user,
row_number() over (partition by a.caseno order by a.tranno desc) as rn
from tablea a
right join tableb b on a.caseno=b.caseno
right join tablec c on c.pcode=b.pcode
where a.date between 140124 and 140331
) t
where rn = 1;
Run Code Online (Sandbox Code Playgroud)
您还可以使用混淆的时间戳信息进行排序:
row_number() over (partition by a.caseno order by a.date desc, a.time desc) as rn
Run Code Online (Sandbox Code Playgroud)
鉴于您的示例,它可能不会有所作为。