db2 如何使用ROW_NUMBER()PARTITION BY()?

vtwuwzda  于 4个月前  发布在  DB2
关注(0)|答案(2)|浏览(74)

我如何为这个数据集实现ROW_NUMBER() PARTITION BY()来获得这些结果?我只是想看看一个人目前注册的当前程序。
代码:

SELECT
    PERSON_ID,
    PROGRAM_JOINED,
    EFFECTIVE DATE,
    PROGRAM_FINISHED_FLAG
    
FROM PROGRAM_DATE_TRACK

字符串
日期追踪
| 个人ID|联系我们|截止日期|装饰_完成_标志|
| --|--|--|--|
| 1 |芭蕾|2023年8月1日|N|
| 1 |绘画|2023年8月1日|N|
| 1 |陶瓷|2023年5月30日|Y|
| 2 |图形绘制|2023年8月1日|N|
| 2 |芭蕾|2023年5月30日|Y|
| 2 |芭蕾|2022年8月1日|N|
| 3 |抽头|2023年8月1日|N|
| 3 |针织|2021年1月1日|Y|
我需要看到的是:
| 个人ID|联系我们|截止日期|装饰_完成_标志|
| --|--|--|--|
| 1 |芭蕾|2023年8月1日|N|
| 1 |绘画|2023年8月1日|N|
| 2 |图形绘制|2023年8月1日|N|
| 3 |抽头|2023年8月1日|N|
我试过这个,但它包括已经结束的节目日期。例如,第二个人在2022年8月1日开始芭蕾舞,但在2023年5月30日结束。

SELECT
    PERSON_ID,
    PROGRAM_JOINED,
    EFFECTIVE DATE,
    PROGRAM_FINISHED_FLAG
    ROW_NUMBER() OVER (PARTITION BY PERSON_ID, PROGRAM_JOINED  ORDER BY EFFECTIVE DATEE DESC) AS RANK
FROM PROGRAM_DATE_TRACK
WHERE PROGRAM_FINISHED_FLAG = 'N'


结果如下:
| 个人ID|联系我们|截止日期|装饰_完成_标志|秩|
| --|--|--|--|--|
| 1 |芭蕾|2023年8月1日|N| 1 |
| 1 |绘画|2023年8月1日|N| 1 |
| 2 |图形绘制|2023年8月1日|N| 1 |
| 2 |芭蕾|2022年8月1日|N| 1 |
| 3 |抽头|2023年8月1日|N| 1 |

nkkqxpd9

nkkqxpd91#

你可以做

select *
from (
  select t.*,
    row_number() over(partition by person_id, program_joined
                      order by effective_date desc) as rn
  from PROGRAM_DATE_TRACK t
) x
where rn = 1 and program_finished_flag = 'N'

字符串
测试结果:

PERSON_ID  PROGRAM_JOINED  EFFECTIVE_DATE  PROGRAM_FINISHED_FLAG  RN 
---------- --------------- --------------- ---------------------- -- 
 1         Ballet          2023-08-01      N                      1  
 1         Painting        2023-08-01      N                      1  
 2         Figure Drawing  2023-08-01      N                      1  
 3         Tap             2023-08-01      N                      1


请参见db<>fiddle上的运行示例。

vaj7vani

vaj7vani2#

您也可以尝试使用max

with cte as (
  select * , Max(PROGRAM_FINISHED_FLAG) over(partition by PERSON_ID, PROGRAM_JOINED) flag
  from t
)
select * 
from cte
where flag = 'N';

字符串

相关问题