求助:编写SQL识别DB2中SubKey=1且重复的关联记录
DB2 SQL 解决方案
原数据集
| GUID | ID | Key | SubKey |
|---|---|---|---|
| ABC-123-DEF | 1234567 | 20 | 1 |
| ABC-123-DEF | 1234567 | 22 | 1 |
| ABC-123-DEF | 1234567 | 21 | 2 |
| ABC-123-DEF | 1234568 | 22 | 1 |
| ABC-124-DEF | 1234667 | 21 | 2 |
| ABC-124-DEF | 1234668 | 22 | 2 |
| ABC-125-DEF | 1234767 | 21 | 1 |
| ABC-125-DEF | 1234768 | 22 | 1 |
期望输出
| GUID | ID | Key | SubKey |
|---|---|---|---|
| ABC-123-DEF | 1234567 | 20 | 1 |
| ABC-123-DEF | 1234567 | 22 | 1 |
| ABC-123-DEF | 1234567 | 21 | 2 |
| ABC-123-DEF | 1234568 | 22 | 1 |
| ABC-125-DEF | 1234767 | 21 | 1 |
| ABC-125-DEF | 1234768 | 22 | 1 |
实现方案
方案1:子查询关联
先筛选出符合条件的GUID,再关联原表获取完整数据:
SELECT t.* FROM your_table t JOIN ( SELECT GUID FROM your_table WHERE SubKey = 1 GROUP BY GUID HAVING COUNT(*) > 1 ) filtered_guids ON t.GUID = filtered_guids.GUID ORDER BY t.GUID, t.ID, t.SubKey;
方案2:窗口函数(更高效)
通过窗口函数一次性统计每个GUID下SubKey=1的记录数,再筛选结果:
SELECT GUID, ID, Key, SubKey FROM ( SELECT *, COUNT(CASE WHEN SubKey = 1 THEN 1 END) OVER (PARTITION BY GUID) AS subkey1_count FROM your_table ) t WHERE subkey1_count > 1 ORDER BY GUID, ID, SubKey;
两种方案均适用于DB2数据库,窗口函数方案仅需扫描一次表,在数据量较大时性能更优。
内容的提问来源于stack exchange,提问作者datatester
相关产品推荐
相关产品推荐

