DB2按指定列分组查询:优先选取非空LANG值的实现方法
问题描述
现有如下数据:
| ID_1 | ID_2 | ID_3 | LANG |
|---|---|---|---|
| 1 | 11 | 111 | F_lang |
| 1 | 11 | 111 | null |
| 2 | 22 | 222 | null |
需要构建一条DB2查询语句,仅返回以下两行结果:
| ID_1 | ID_2 | ID_3 | LANG |
|---|---|---|---|
| 1 | 11 | 111 | F_lang |
| 2 | 22 | 222 | null |
要求:按ID_1、ID_2、ID_3分组,每组优先选取LANG列值非空的行;若分组内无LANG非空值,则选取LANG为null的行。
解决方案
可以使用ROW_NUMBER()窗口函数实现需求,通过对每个分组内的行按LANG是否非空排序,优先保留非空行,再筛选出每个分组的第一行即可:
SELECT ID_1, ID_2, ID_3, LANG FROM ( SELECT ID_1, ID_2, ID_3, LANG, ROW_NUMBER() OVER ( PARTITION BY ID_1, ID_2, ID_3 ORDER BY CASE WHEN LANG IS NOT NULL THEN 0 ELSE 1 END ) AS rn FROM 你的表名 ) t WHERE rn = 1;
逻辑说明
PARTITION BY ID_1, ID_2, ID_3:按前三列将数据分组ORDER BY CASE WHEN LANG IS NOT NULL THEN 0 ELSE 1 END:让LANG非空的行排在分组内的最前面,null值的行排在后面- 外层查询筛选
rn=1,即取每个分组的第一行,也就是符合优先级要求的目标行
内容的提问来源于stack exchange,提问作者DB2fan
相关产品推荐
相关产品推荐

