跳过最大时间戳并获取其他时间戳

时间:2018-02-02 18:07:01

标签: mysql oracle oracle11g

表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。

希望我对我的要求很清楚。

1 个答案:

答案 0 :(得分:0)

这是一种方法。

由于您没有提供测试用例,我反过来也懒得输入全名。虽然,你解释得很好,谢谢你。

  • TA和TB是你的A和B表
  • REG_ID是您的REGISTRATION_ID
  • QUALI_1和QUALI_2代表您的两个资格认证步骤

我们走了:

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>