表A具有Registration_id和Client_No。
表B包含每个Registration_id的Last_Login_Email,Last_Login_Mobile和Last_Login_OFX时间戳。
我的要求如下: - 获取与多个Client_no绑定的所有Registration_id,并使用最大时间戳跳过这些Register_id并获取其他。
实施例: -
表A
Registration_id Client_No
AAA 111
BBB 111
CCC 111
DDD 444
EEE 555
FFF 666
GGG 666
所以在上面的表AAA中,BBB,CCC与同一个Client_no绑定为111.Also FFF,GGG绑定到相同的CLient_no,即666.
因此,这些Registration_id(AAA,BBB,CCC)和(FFF,GGG)符合我的第一部分条件。
现在第1套Registration_id与同一个Client_no相关联,我想跳过具有最大时间戳的Registration_id并获取其他内容。对于第2套也是如此,等等。
示例:(对于输入的信心,我在下面的示例中使用了Date而不是timestamp)
表B
表B DD / MM / YYYY DD / MM / YYYY DD / MM / YYYY
Registration_id Last_Login_Email Last_Login_Mobile Last_Login_OFX
AAA 01/12/2017 02/12/2017 01/11/2017
BBB 01/01/2018 02/01/2018 03/01/2018
CCC 01/11/2017 02/11/2017 03/11/2017
DDD 01/01/2018 02/01/2018 03/01/2018
EEE 21/01/2018 22/01/2018 23/01/2018
FFF 12/01/2018 13/01/2018 14/01/2018
GGG 29/01/2018 28/01/2018 31/01/2018
注意: - 在上表B中,我们不需要对DDD和EEE做任何事情,因为它们在条件的第一部分不合格。我在上表中只是为了完整性而给出。
让我们在这里获得第一组,即AAA,BBB,CCC
表B Last_Login_Email,Last_Login_Mobile的最大时间戳 andLast_Login_OFX
AAA 02/12/2017
BBB 03/01/2018
CCC 03/11/2017
上面我们可以看到最大时间戳是针对BBB(超出AAA,BBB,CCC)所以我想在这里跳过BBB并获取AAA和CCC。
与其他集合相同,即FFF,GGG
表B Last_Login_Email,Last_Login_Mobile和。的最大时间戳 Last_Login_OFX
FFF 14/01/2018
GGG 31/01/2018
上面我们可以看到GGG的最大时间戳,所以我需要跳过GGG并获取FFF。
所以我的整体逻辑应该获取AAA,CCC和FFF。
希望我对我的要求很清楚。
答案 0 :(得分:0)
这是一种方法。
由于您没有提供测试用例,我反过来也懒得输入全名。虽然,你解释得很好,谢谢你。
我们走了:
SQL> with quali_1 as
2 (select reg_id, client_no
3 from ta
4 where client_no in (select client_no
5 from ta
6 group by client_no
7 having count(distinct reg_id) > 1)
8 ),
9 quali_2 as
10 (select b.reg_id, q.client_no,
11 greatest(b.ll_email, b.ll_mobile, b.ll_ofx) ll_max
12 from tb b join quali_1 q on b.reg_id = q.reg_id
13 )
14 select reg_id
15 from quali_2
16 where (client_no, ll_max) not in
17 (select client_no, max(ll_max) ll_max
18 from quali_2
19 group by client_no)
20 order by reg_id;
REG
---
aaa
ccc
fff
SQL>