按条件去重:存在online记录则保留,否则保留最早记录
解决方案
去重规则
- 若
org_id下存在stage = 'online'的记录,保留所有该类记录; - 若
org_id下无stage = 'online'的记录,仅保留row_number = 1的最早记录。
原始数据
| sales_id | org_id | stage | row_number |
|---|---|---|---|
| ccc_123 | ccc | off-line | 1 |
| ccc_123 | ccc | off-line | 2 |
| ccc_123 | ccc | online | 3 |
| abc_123 | abc | off-line | 1 |
| abc_123 | abc | power-off | 2 |
| zzz_123 | zzz | power-off | 1 |
预期结果
| sales_id | org_id | stage |
|---|---|---|
| ccc_123 | ccc | online |
| abc_123 | abc | off-line |
| zzz_123 | zzz | power-off |
SQL 实现(通用窗口函数写法)
适用于支持窗口函数的数据库(MySQL 8+、PostgreSQL、SQL Server等):
WITH org_online_flag AS ( SELECT sales_id, org_id, stage, row_number, -- 标记当前org_id是否存在online记录 MAX(CASE WHEN stage = 'online' THEN 1 ELSE 0 END) OVER (PARTITION BY org_id) AS has_online FROM your_table ) SELECT sales_id, org_id, stage FROM org_online_flag WHERE -- 保留online记录 stage = 'online' -- 或无online记录时保留最早的那条 OR (has_online = 0 AND row_number = 1);
逻辑说明
- 通过CTE给每个
org_id分组,标记该组是否存在stage = 'online'的记录(has_online为1表示存在,0表示不存在); - 筛选时优先保留所有
stage = 'online'的记录;对于没有online记录的组,仅保留row_number = 1的最早记录,契合原始数据已按row_number升序的前提。
内容的提问来源于stack exchange,提问作者Andy Nguyen
相关产品推荐
相关产品推荐

