You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DB2按指定列分组查询:优先选取非空LANG值的实现方法

问题描述

现有如下数据:

ID_1ID_2ID_3LANG
111111F_lang
111111null
222222null

需要构建一条DB2查询语句,仅返回以下两行结果:

ID_1ID_2ID_3LANG
111111F_lang
222222null

要求:按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 01:22:13