基于分析条件筛选Oracle表行:按ID分组自定义排序
嘿,我来帮你搞定这个Oracle分组排序的需求,先把示例数据整理清楚,再给你对应的SQL实现哈~
示例数据表
| id | start_dt | cancel_dt | record_eff_dt | latest_row_flag |
|---|---|---|---|---|
| 1 | null | null | 01/01/2018 | N |
| 1 | 01/02/2018 | 01/02/2018 | 01/02/2018 | N |
| 1 | 01/03/2018 | null | 01/03/2018 | Y |
| 2 | null | 01/04/2018 | 01/04/2018 | Y |
| 3 | 01/05/2018 | null | 01/05/2018 | N |
| 3 | null | 01/06/2018 | 01/06/2018 | Y |
分组排序规则
我们需要按id分组(PARTITION BY id),排序优先级如下:
- 最高优先级(排名1):当
start_dt不为空、cancel_dt为空且latest_row_flag = 'Y'的记录 - 其余记录:我默认按
record_eff_dt倒序排列(因为你没给出剩余条件,这个规则可以根据你的实际需求调整)
实现SQL代码
SELECT t.*, ROW_NUMBER() OVER ( PARTITION BY t.id ORDER BY -- 标记符合条件1的记录为最高优先级 CASE WHEN t.start_dt IS NOT NULL AND t.cancel_dt IS NULL AND t.latest_row_flag = 'Y' THEN 1 ELSE 2 END ASC, -- 其他记录按生效日期倒序,可按需修改 t.record_eff_dt DESC ) AS row_rank FROM your_table_name t;
代码说明
- 用
ROW_NUMBER()窗口函数实现分组内的排名,PARTITION BY id保证每个id单独排序 CASE表达式把符合条件1的记录标记为1,其他为2,升序排列后符合条件的自然排第一- 后面的
record_eff_dt DESC是给其余记录的排序规则,你可以换成你需要的其他条件,比如cancel_dt或者latest_row_flag的顺序
内容的提问来源于stack exchange,提问作者user1751356
相关产品推荐
相关产品推荐

