DB2中关联表获取分组最大nr值并关联rsp字段的实现
数据表关联处理方案:提取最大nr记录并格式化etu字段
搞定这个需求很直观,我先把基础数据、需求逻辑和可执行的SQL方案一步步理清楚:
一、基础数据表信息
先明确两个源表的结构和数据:
Table I
| etu | nr |
|---|---|
| 1 | 2 |
| 2 | 2 |
| 2 | 3 |
| 2 | 1 |
| 3 | 4 |
| 3 | 9 |
Table A
| etu | rsp | nr |
|---|---|---|
| 2 | 8 | 2 |
| 2 | 7 | 3 |
| 2 | 3 | 1 |
| 3 | 2 | 4 |
| 3 | 6 | 9 |
二、核心需求拆解
我们要生成的结果表需要满足三个关键规则:
- 基于
etu和nr字段关联Table I和Table A - 每个
etu只保留nr值最大的那一条记录,并匹配对应的rsp值 - 如果Table I中某个
etu存在多条记录,结果里的etu值要加上后缀..
三、可执行SQL实现(标准SQL兼容多数数据库)
WITH ranked_etu_records AS ( SELECT etu, nr, -- 统计当前etu的总记录数,用于判断是否加后缀 COUNT(*) OVER (PARTITION BY etu) AS etu_record_count, -- 给每个etu下的nr按降序排名,排名1的就是最大nr ROW_NUMBER() OVER (PARTITION BY etu ORDER BY nr DESC) AS rank_num FROM TableI ) SELECT -- 根据记录数决定是否添加".."后缀 CASE WHEN rer.etu_record_count > 1 THEN CONCAT(rer.etu, '..') ELSE CAST(rer.etu AS VARCHAR) END AS etu, rer.nr, ta.rsp FROM ranked_etu_records rer INNER JOIN TableA ta ON rer.etu = ta.etu AND rer.nr = ta.nr WHERE rer.rank_num = 1; -- 只保留每个etu下nr最大的记录
四、执行结果验证
运行上面的SQL后,会得到你需要的结果表:
| etu | nr | rsp |
|---|---|---|
| 2.. | 3 | 7 |
| 3.. | 9 | 6 |
五、逻辑说明
- CTE预处理Table I:用窗口函数先给每个
etu分组,统计组内记录数,同时给组内的nr按降序排号,这样排名第1的就是该etu下最大的nr记录。 - 关联Table A:通过
etu和nr把预处理后的Table I和Table A关联,确保拿到对应rsp值。 - 格式化etu字段:用
CASE判断,如果当前etu的记录数大于1,就拼接..后缀,否则直接显示原数值。
内容的提问来源于stack exchange,提问作者Viking
相关产品推荐
相关产品推荐

