IBM DB2中如何从Order表按人员复合主键仅返回单条记录
IBM DB2 查询:每个人员仅显示一行订单记录
表结构说明
1. People表
复合主键为key_a、key_b,结构如下:
| key_a | key_b | Name... | age... | e-mail... |
|---|---|---|---|---|
| 120 | 2245 | |||
| 140 | 5689 |
2. Order表
复合主键包含key_people_a、key_people_b、key_order_a、key_order_b,其中key_people_a、key_people_b关联People表的复合主键,现有数据:
| key_people_a | key_people_b | key_order_a | key_order_b | description... |
|---|---|---|---|---|
| 120 | 2245 | 123 | 789 | |
| 120 | 2245 | 123 | 456 | |
| 140 | 5689 | 123 | 321 |
需求
编写针对Order表的SELECT语句,实现每个人员仅显示一行订单记录,预期结果:
| key_people_a | key_people_b | key_order_a | key_order_b | description... |
|---|---|---|---|---|
| 120 | 2245 | 123 | 789 | |
| 140 | 5689 | 123 | 321 |
解决方案
在IBM DB2中,可通过窗口函数ROW_NUMBER()按人员分组后取每组第一行,示例SQL如下:
SELECT key_people_a, key_people_b, key_order_a, key_order_b, description... FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY key_people_a, key_people_b ORDER BY key_order_b DESC) AS rn FROM "Order" ) t WHERE rn = 1;
关键说明
PARTITION BY key_people_a, key_people_b:按人员的复合主键分组,确保同一人员的订单被归为一组ORDER BY key_order_b DESC:指定每组内的排序规则(此处按key_order_b降序,匹配预期结果中取789这条的逻辑;若需其他规则,可调整排序字段)- 外层查询筛选
rn=1,仅保留每组的第一行记录
内容的提问来源于stack exchange,提问作者Adriano Valentim
相关产品推荐
相关产品推荐

