sql - 使用 CASE 语句仅在列中显示某些结果(也创建重复项)
问题描述
对不起,如果这没有意义 - 我不知道如何措辞。让我尝试更好地解释。
我目前正在使用一个非常基本的查询来查看属于诊所的患者的人口统计信息。该查询使用CASE
语句来创建几个新列,这些列旨在在 Excel 中进行过滤,以便用户稍后查看数据。
其中一项CASE
陈述围绕着患者是否在诊所活跃——他们必须在过去 3 年内被视为活跃。该语句仅查看患者的最后一次就诊日期,计算该日期与今天日期之间的差异,然后如果该差异小于 3 年,则显示“是”。
但随后患者有所谓的标志。当医生访问患者的图表时,会弹出不同的标记,指示患者的服务/治疗逾期、未付账单等。可用标记之一是“非活动患者!” 当图表被停用、患者死亡或转移护理等时,由医疗记录部门手动添加。
此查询的目的是显示系统中所有患者的所有人口统计数据,然后有一个字段指示他们是否有“非活动患者!” 标志,然后可以与它们是否按照 3 年标准进行比较。CASE
因此,如果患者的图表上附加了该标志,我将第二条语句设置为显示“是”。请注意,我不想只看到不活跃的患者,而是所有可用的患者以及这些患者是否有标志。
我的查询有效,尽管一旦我添加了新CASE
语句来检查非活动标志,它就变慢了,运行了整整 6 分钟。诚然,系统中有大约 30,000 名患者,其中大多数人的图表上附有许多标志,但这似乎仍然很长。对于确实有该标志的患者,我也得到了重复的结果,因为我选择了不同的记录,但是CASE
对于 3 年内活跃患者的第一个语句不会产生重复。
简而言之,我觉得我不会以最有效的方式来解决这个问题。有人对如何清理这个有任何建议吗?请参阅下面的查询。
SELECT DISTINCT
d.PatientID
,d.PatientName
,...[other demographic fields like DOB, gender, race]
,a.LastVisitDate
,a.NextApptDate
,(CASE
WHEN a.LastVisitDate > DATEADD(yy,-3,GETDATE()) THEN 'YES'
ELSE ''
END) AS [Active?]
,(CASE
WHEN d.PatientFlag = 'Inactive Patient!' THEN 'YES'
ELSE ''
END) AS [Inactive Flag?]
FROM Demographic d FULL OUTER JOIN Appointment a ON d.PatientID = a.PatientID
重复的结果最终看起来像这样。带有非活动标志的患者会重复他们的整行人口统计信息,然后一行显示标志指示器,而另一行不显示。
PatientID PatientName ... LastVisitDate NextApptDate Active? Inactive Flag?
-------------------------------------------------------------------------------------------
1001 John Smith ... 01/03/2020 NULL YES
1002 Jane Doe ... 07/23/2020 12/29/2020 YES
1002 Jane Doe ... 07/23/2020 12/29/2020 YES YES
1003 Bob Brown ... NULL 12/21/2020 YES
更新:这是我得到的实际重复结果之一的示例。正如我们所看到的,该患者的行之一具有由 创建的非活动指示符CASE
,而另一行没有(因此使它们成为两个唯一行)。该患者最后一次见到是今年,因此按照 3 年的标准,他们仍然活跃,但他们的图表上无疑有非活跃标志,因为他们现在已经去世。该患者在系统中还总共有 35 次过去就诊,显然我的结果中没有得到所有 35 次就诊。这是因为LastVisitDate
和NextApptDate
是唯一的并且与 具有 1:1 的关系PatientID
。
解决方案
也许你需要这样的东西......
您实际上并不想要所有约会,您只想要最近的约会。正确的?
SELECT d.PatientID, d.PatientName
-- ...[other demographic fields like DOB, gender, race]
, a.LastVisitDate
, a.NextApptDate
, IsActive = CASE WHEN a.LastVisitDate > DATEADD(YEAR, -3, GETDATE()) THEN 'YES' ELSE '' END
, InactiveFlag = CASE WHEN d.PatientFlag = 'Inactive Patient!' THEN 'YES' ELSE '' END
FROM Demographic d
OUTER APPLY (
SELECT TOP(1) a.LastVisitDate, a.NextApptDate
FROM Appointment a
WHERE d.PatientID = a.PatientID
ORDER BY a.LastVisitDate DESC
) a
推荐阅读
- html - 使用 Web 链接打开快速帮助
- javascript - 为什么在日期对象上调用 Object.getOwnPropertyDescriptors 返回一个空数组?
- php - php7.2-openssl Alpine Docker 安装错误
- sql - 使用 SQL 通过 QSYS2.IFS_WRITE 将 json 文件发送到 IBM System i 上的 IFS
- java - 在Android中单击边界外时触发甜蜜警报
- android - 如何在 Jetpack Compose 中对齐按钮内的不同元素?
- database - sqflite-Flutter 数据库
- flutter - 我在 Flutter 中使用“jitsi meet”。我想摆脱通话屏幕上的菜单选项卡
- vue.js - 如何处理 nuxt apollo 中的网络错误
- openbmc - 由于 ads1115 传感器配置文件未正确安装,因此跳过了 Phosphor Hwmon Poller