如何在SQL中按分组多值判断规则生成目标结果表
SQL解决方案:按分组规则筛选目标记录
样本主表
| center | document | documentitem | profit |
|---|---|---|---|
| NL100 | 100 | 00010 | 5 |
| NL101 | 100 | 00010 | 10 |
| NL100 | 100 | 00010 | 0 |
| NL102 | 100 | 00010 | 5 |
| NL200 | 200 | 00010 | 1 |
| NL300 | 300 | 00010 | 6 |
| NL300 | 300 | 00010 | 7 |
| NL300 | 300 | 00010 | 4 |
筛选规则
- 场景1:
document + documentitem分组下仅1条center记录,直接保留该记录(如200+00010分组) - 场景2:分组下有多条记录但center值全部相同,保留任意一条(如300+00010分组)
- 场景3:分组下存在多个不同center值,保留
profit=0的记录(如100+00010分组)
目标结果表
| center | document | documentitem | profit |
|---|---|---|---|
| NL100 | 100 | 00010 | 0 |
| NL200 | 200 | 00010 | 1 |
| NL300 | 300 | 00010 | 4 |
SQL实现
WITH grouped_stats AS ( SELECT *, -- 统计分组内不同center的数量 COUNT(DISTINCT center) OVER (PARTITION BY document, documentitem) AS distinct_center_count, -- 标记当前记录是否为profit=0的行 CASE WHEN profit = 0 THEN 1 ELSE 0 END AS is_zero_profit, -- 给同center的记录生成行号(用于场景2取任意一条) ROW_NUMBER() OVER (PARTITION BY document, documentitem, center ORDER BY profit) AS rn FROM your_table_name -- 替换为你的实际表名 ) SELECT center, document, documentitem, profit FROM grouped_stats WHERE -- 场景3:分组存在多个不同center,且当前是profit=0的记录 (distinct_center_count > 1 AND is_zero_profit = 1) -- 场景1+场景2:分组center唯一,取任意一条记录 OR (distinct_center_count = 1 AND rn = 1);
逻辑说明
- CTE
grouped_stats:distinct_center_count:区分分组属于多center(场景3)还是单center(场景1/2)。is_zero_profit:快速定位场景3需要保留的目标行。rn:在document+documentitem+center子分组内生成行号,确保场景2中同center的多条记录只取一条,场景1的单条记录自然也会被选中。
- 主查询筛选:
- 直接匹配三个场景的条件,一次性输出符合要求的记录。
内容的提问来源于stack exchange,提问作者rutgerv
相关产品推荐
相关产品推荐

