SELECT *
FROM
(
SELECT
*
,ROW_NUMBER() OVER (PARTITION BY PERSON_NUM, ACTION_CODE ORDER BY EFF_END_DATE DESC) as rn
,COUNT(CASE WHEN ACTION_CODE = 'RE' THEN 1 END) OVER (PARTITION BY PERSON_NUM) as RECount
,COUNT(CASE WHEN ACTION_CODE = 'TERM' THEN 1 END) OVER (PARTITION BY PERSON_NUM) as TERMCount
FROM
xx_WR
) t
WHERE
t.rn = 1
AND t.ACTION_CODE = 'RE'
AND t.RECount > t.TERMCount
所以ROW_NUMBER()
只会这样做,它会建立一个行号。您实际上需要比较RE
记录的数量与PERSON_NUM
的TERM
记录的数量。根据您的描述,听起来好像您可能能够获得一个案例,如RE -> TERM -> RE
,然后您希望返回该案例。无论如何,在这里使用窗口函数是非常好的,尤其是当你与条件聚合合作。另请注意,此解决方案将处理RE -> RE
大小写,并仍返回最新的RE记录。
注意,如果你想找到只有在没有长期记录,在所有像这样的情况下,您可以适应:
SELECT *
FROM
(
SELECT
*
,ROW_NUMBER() OVER (PARTITION BY PERSON_NUM, ACTION_CODE ORDER BY EFF_END_DATE DESC) as rn
,COUNT(CASE WHEN ACTION_CODE = 'RE' THEN 1 END) OVER (PARTITION BY PERSON_NUM) as RECount
,COUNT(CASE WHEN ACTION_CODE = 'TERM' THEN 1 END) OVER (PARTITION BY PERSON_NUM) as TERMCount
FROM
xx_WR
) t
WHERE
t.rn = 1
AND t.ACTION_CODE = 'RE'
AND t.TERMCount = 0
如果你只希望有人用1条RE记录,并没有任期,你可以只再次小幅改变where子句,或者您也不必行号再要么,所以你可以这样做:
SELECT *
FROM
(
SELECT
*
,COUNT(CASE WHEN ACTION_CODE = 'RE' THEN 1 END) OVER (PARTITION BY PERSON_NUM) as RECount
,COUNT(CASE WHEN ACTION_CODE = 'TERM' THEN 1 END) OVER (PARTITION BY PERSON_NUM) as TERMCount
FROM
xx_WR
) t
WHERE
t.ACTION_CODE = 'RE'
AND t.RECount = 1
AND t.TERMCount = 0
你能分享预期的结果吗? –
使用这一个内部查询'SELECT xx_WR.ACTION_CODE ACTION_CODE, COUNT(*)over(partition BY BY PERSON_NUM)ASFROM xx_WR' –