如何筛选满足多条件的服务记录:同一PERSON_ID与DATE_OF_SERVICE优先保留DOCTOR非空条目
解决方案:按指定规则筛选医疗服务记录
需求确认
该需求完全可实现,核心逻辑是对同一PERSON_ID和DATE_OF_SERVICE的分组记录,优先保留DOCTOR非空的条目;若分组内全为空,则保留空条目。
现有数据
| PERSON_ID | DOCTOR | DATE_OF_SERVICE |
|---|---|---|
| 1234 | Dr. Smith | 2022-01-01 |
| 1234 | 2022-01-01 | |
| 1234 | Dr. Jane | 2022-03-01 |
| 1234 | 2022-06-01 |
期望输出
| ID | DOCTOR | DATE_OF_SERVICE |
|---|---|---|
| 1234 | Dr. Smith | 2022-01-01 |
| 1234 | Dr. Jane | 2022-03-01 |
| 1234 | 2022-06-01 |
SQL实现方案
使用窗口函数ROW_NUMBER()对每组记录排序,优先保留DOCTOR非空条目,代码如下:
WITH ranked_records AS ( SELECT PERSON_ID AS ID, DOCTOR, DATE_OF_SERVICE, -- 给DOCTOR非空的记录分配排名1,空值分配排名2 ROW_NUMBER() OVER ( PARTITION BY PERSON_ID, DATE_OF_SERVICE ORDER BY CASE WHEN DOCTOR IS NOT NULL AND DOCTOR != '' THEN 1 ELSE 2 END ) AS rn FROM your_table_name ) SELECT ID, DOCTOR, DATE_OF_SERVICE FROM ranked_records WHERE rn = 1;
代码逻辑说明
- 分组:通过
PARTITION BY PERSON_ID, DATE_OF_SERVICE将同一患者同一服务日期的记录归为一组。 - 排序规则:用
CASE表达式标记优先级,DOCTOR非空的记录排第1位,空值排第2位,确保每组内非空条目优先保留。 - 筛选:只保留每组中排名为1的记录,若组内全为空,则保留那条空记录。
补充说明
- 若数据库中
DOCTOR字段的空值是NULL而非空字符串,可将CASE条件简化为CASE WHEN DOCTOR IS NOT NULL THEN 1 ELSE 2 END。 - 代码支持多患者批量处理,无需额外修改。
内容的提问来源于stack exchange,提问作者Hyder
相关产品推荐
相关产品推荐

