我正在编辑这篇文章,以澄清我的问题。
假设我有一个保存患者信息的表。我需要找到今年的新病人,以及当他们被认为是新病人时,他们开出的第一张处方的日期。任何时候只要有六个月的间隔,他们就被认为是新患者。
如何使用SQL来完成此操作。我可以用Java和任何其他命令式语言很容易地做到这一点,但我在用SQL做到这一点时遇到了问题。我需要这个脚本运行在水晶中的非SQL用户
Table:
Patient ID Prescription Date
-----------------------------------------
1 12/31/16
1 03/13/17
2 10/10/16
2 05/11/17
2 06/11/17
3 01/01/17
3 04/20/17
4 01/31/16
4 01/01/17
4 07/02/17 因此,患者2和4被认为是新患者。患者4被认为是两次新患者,所以我需要每次患者4被认为是新患者1/1/17和7/2/17的日期。患者1和3今年不被认为是新患者。
到目前为止,我有下面的代码,它告诉我今年他们是不是新的,但如果他们今年还有六个月的空档,就不会。
SELECT DISTINCT
this_year.patient_id
,this_year.date
FROM (SELECT
patient_id
,MIN(prescription_date) as date
FROM table
WHERE prescription_date BETWEEN '2017-01-01 00:00:00.000' AND '2017-
12-31 00:00:00.000'
GROUP BY [patient_id]) AS this_year
LEFT JOIN (SELECT
patient_id
,MAX(prescription_date) as date
FROM table
WHERE prescription_date BETWEEN '2016-01-01 00:00:00.000' AND '2016-
12-31 00:00:00.000'
GROUP BY [patient_id]) AS last_year
WHERE DATEDIFF(month, last_year.date, this_year.date) > 6
OR last_year.date IS NULL发布于 2017-06-14 22:13:31
在您的示例中,患者2是否不满足您指定的标准...话虽如此..。
你可以试试像这样的东西。未经测试,但应该类似(假设您可以将其放入存储过程中):
WITH ordered AS ( SELECT *, ROW_NUMBER() OVER (ORDER BY [Prescription Date]) rn FROM table1 ) SELECT o1.[PatientID], DATEDIFF(s, o1.[Prescription Date], o2.[Prescription Date]) diff FROM ordered o1 JOIN ordered o2 ON o1.rn + 1 = o2.rn WHERE DATEDIFF(m, o1.[Prescription Date], o2.[Prescription Date]) > 6
将table1替换为您的表名。
发布于 2017-06-14 22:39:39
我想你的意思是这个病人在过去的6个月里没有开过药。
SELECT DISTINCT user_id
FROM table_name
WHERE prescribed_date >= DATEADD(month, -6, GETDATE())这将为您提供过去6个月内指定的用户列表。您需要不在此列表中的用户列表。
SELECT DISTINCT user_id
FROM table_name
WHERE user_id NOT IN (SELECT DISTINCT user_id
FROM table_name
WHERE prescribed_date >= DATEADD(month, -6, GETDATE()))您需要修改字段和表名。
https://stackoverflow.com/questions/44547058
复制相似问题