首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL-使用相同的外键查找x个月的差距

SQL-使用相同的外键查找x个月的差距
EN

Stack Overflow用户
提问于 2017-06-14 22:03:19
回答 2查看 64关注 0票数 0

我正在编辑这篇文章,以澄清我的问题。

假设我有一个保存患者信息的表。我需要找到今年的新病人,以及当他们被认为是新病人时,他们开出的第一张处方的日期。任何时候只要有六个月的间隔,他们就被认为是新患者。

如何使用SQL来完成此操作。我可以用Java和任何其他命令式语言很容易地做到这一点,但我在用SQL做到这一点时遇到了问题。我需要这个脚本运行在水晶中的非SQL用户

代码语言:javascript
复制
    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今年不被认为是新患者。

到目前为止,我有下面的代码,它告诉我今年他们是不是新的,但如果他们今年还有六个月的空档,就不会。

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 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替换为您的表名。

票数 0
EN

Stack Overflow用户

发布于 2017-06-14 22:39:39

我想你的意思是这个病人在过去的6个月里没有开过药。

代码语言:javascript
复制
SELECT DISTINCT user_id
FROM table_name 
WHERE prescribed_date >= DATEADD(month, -6, GETDATE())

这将为您提供过去6个月内指定的用户列表。您需要不在此列表中的用户列表。

代码语言:javascript
复制
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()))

您需要修改字段和表名。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44547058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档