如何筛选同一护理员同日访问多名患者的记录?
解决同一护理员同一天访问多名患者的查询需求
嘿,这个需求很典型,我来给你几个实用的SQL方案,刚好能解决你用JOIN遇到的困惑!
核心思路
首先我们得先定位出哪些「护理员+日期」的组合对应的患者数量≥2,然后再把原表中属于这些组合的记录筛选出来就行。
方案1:用窗口函数(推荐,适合现代SQL数据库)
如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server等),这个方法最直观:
SELECT caretakerCode, patientID, visitDate, visitAddress FROM ( SELECT *, -- 按护理员和日期分组,统计每组的不同患者数量 COUNT(DISTINCT patientID) OVER (PARTITION BY caretakerCode, visitDate) AS patient_count FROM your_table_name -- 替换成你的实际表名 ) AS sub_query -- 只保留患者数量大于1的记录 WHERE patient_count > 1;
方案2:用JOIN实现(对应你尝试的思路)
如果你想用JOIN的方式,其实是先通过子查询找出有问题的「护理员+日期」组合,再和原表关联:
SELECT t.* FROM your_table_name t INNER JOIN ( -- 先找出同一护理员同一天访问多名患者的组合 SELECT caretakerCode, visitDate FROM your_table_name GROUP BY caretakerCode, visitDate -- 统计不同患者数大于1才符合条件 HAVING COUNT(DISTINCT patientID) > 1 ) AS duplicate_groups ON t.caretakerCode = duplicate_groups.caretakerCode AND t.visitDate = duplicate_groups.visitDate;
注意点
- 记得把
your_table_name替换成你实际的表名 - 如果
visitDate字段包含时间(比如2022/01/14 09:30),需要用日期函数提取纯日期部分再分组,比如DATE(visitDate)(不同数据库函数可能略有差异,比如SQL Server用CAST(visitDate AS DATE)) - 用
COUNT(DISTINCT patientID)是为了排除同一护理员同一天多次访问同一患者的情况,如果你不需要排除这种情况,直接用COUNT(patientID)就行
用你给的测试数据跑这两个查询,都会得到你期望的输出结果哦!
内容的提问来源于stack exchange,提问作者pursuitOf
相关产品推荐
相关产品推荐

