分组聚合函数从1:1 、1:n、n:1、n:n筛选1:1

1.场景:两个相关联的表之间,有1:1、1:n、n:1、n:n等多种关系,从中筛选出1:1的数据。
表A:
在这里插入图片描述
表B:
在这里插入图片描述
方案:4次分组聚合函数从1:1、1:n、n:1、n:n 中找出 1:1的数据(SQL):
SELECT
SUBTSK_NBR,
ACTUAL_NBR
FROM
(
SELECT
SUBTSK_NBR,
ACTUAL_NBR,
CREATE_TIME,
ROWNUMBER_1,
ROWNUMBER_2,
ROWNUMBER_3,
ROW_NUMBER() OVER (PARTITION BY E.ACTUAL_NBR
ORDER BY
E.SUBTSK_NBR ASC) AS ROWNUMBER_4
FROM
(
SELECT
SUBTSK_NBR,
ACTUAL_NBR,
CREATE_TIME,
ROWNUMBER_1,
ROWNUMBER_2,
ROW_NUMBER() OVER (PARTITION BY D.ACTUAL_NBR
ORDER BY
D.SUBTSK_NBR DESC) AS ROWNUMBER_3
FROM
(
SELECT
SUBTSK_NBR,
ACTUAL_NBR,
CREATE_TIME,
ROWNUMBER_1,
ROW_NUMBER() OVER (PARTITION BY C.SUBTSK_NBR
ORDER BY
C.CREATE_TIME ASC) AS ROWNUMBER_2
FROM
(
SELECT
A.SUBTSK_NBR,
B.ACTUAL_NBR,
B.CREATE_TIME,
ROW_NUMBER() OVER (PARTITION BY A.SUBTSK_NBR
ORDER BY
B.CREATE_TIME DESC) AS ROWNUMBER_1
FROM
UCS.CLR_WRITEOFF_SUBTASK A,
UCS.CLR_WRITEOFF_ACTUAL_PAYMENT B
WHERE
a.ACC_NBR = b.ACC_NBR
AND a.WRITEOFF_DIRECT = ‘AR’
AND b.WRITEOFF_DIRECT = ‘AR’
AND ABS(a.TRS_AMT - b.TRS_AMT)<100000
AND a.SUBTSK_STATE = ‘WAIT’
AND b.SUBTSK_STATE = ‘WAIT’
AND a.RECEIVER_FLAG = ‘NUL’
AND b.RECEIVER_FLAG = ‘NUL’
AND(a.associated_id NOT LIKE ‘CHILDREN%’
OR A.associated_id IS NULL) ) C ) D ) E )
WHERE
ROWNUMBER_1 = 1
AND ROWNUMBER_2 = 1
AND ROWNUMBER_3 = 1
AND ROWNUMBER_4 = 1;

思路:第1次先以A表主键为分组 B表时间降序分组排序,第2次先以A表主键为分组 B表时间升序分组排序(参考排序的列不能与参考分组的列有关系);第3次先以B表主键为分组 A表主键降序分组排序,第3次先以B表主键为分组 A表主键升序序分组排序,最后取出四个number为1的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值