当另一个表中的另一条记录满足日期/时间条件时,在SQL中重新编码值

当另一个表中的另一条记录满足日期/时间条件时,在SQL中重新编码值,sql,sql-server,Sql,Sql Server,我试图用SQL回答这个问题: 创建跟进: 1如果患者在出院后7天内进行门诊就诊 如果他们在7天内没有门诊就诊,则为0 应标记在第7天的任何时间就诊的患者(例如,2015年6月2日凌晨2点到ED就诊的患者,2015年2月13日下午5点进行门诊随访的患者,应标记为在7天内进行门诊就诊,即使间隔超过168小时) 下面是一些示例数据和到目前为止我已经掌握的代码。我认为这也需要是一个子查询。注意,下面的数据示例与代码的其余部分是不同的表,我认为这就是为什么需要子查询的原因 注意:门诊记录将不会有Hos

我试图用SQL回答这个问题:

创建跟进:

  • 1如果患者在出院后7天内进行门诊就诊
  • 如果他们在7天内没有门诊就诊,则为0
应标记在第7天的任何时间就诊的患者(例如,2015年6月2日凌晨2点到ED就诊的患者,2015年2月13日下午5点进行门诊随访的患者,应标记为在7天内进行门诊就诊,即使间隔超过168小时)

下面是一些示例数据和到目前为止我已经掌握的代码。我认为这也需要是一个子查询。注意,下面的数据示例与代码的其余部分是不同的表,我认为这就是为什么需要子查询的原因

注意:门诊记录将不会有
Hosp\u admit\u dt
<代码>Hosp_admit_dt将不会有预约入住。另外,请注意,行可以按任何顺序排列。没有给定的偏移量。每个
PAT\u键都有随机数目的记录。迄今为止的答案似乎需要有一个特定的补偿。我不确定我是否知道如何创建一个

示例:查看以下内容:

患者的就诊
83842766
8216694
为医院入院。出院日期
11/10/2014 16:45
。同一名患者于2014年11月13日14:42再次就诊
83883100
。由于这不到7天,因此在就诊
83842766
行中,该患者的
Follow\u-Up
列中将出现
1

SELECT
   [PAT_KEY]
 , [VISIT_KEY]
 , [HOSP_ADMIT_DT]
 , (SELECT --NOT SURE HOW THIS CAN BE DONE) AS 'FOLLOW_UP'
FROM [ESa611337].dbo.[visit$]
WHERE [HOSP_ADMIT_DT] <> 'NA' 
GO

使用
lag
从上一行(基于所需的顺序)获取值,并使用带有条件的
case
表达式设置标志。(运行内部查询以查看如何将以前的值获取到当前行。)

选择不同的按键,
appt_checkin_dt不为空时的情况
你承认吗
和上一个dischrg_dt'NA'

和datediff(day,prev_contact_dt,cast(appt_checkin_dt as date))使用
lag
从前一行获取值(基于所需顺序),并使用带有条件的
case
表达式设置标志。(运行内部查询以查看如何将以前的值获取到当前行。)

选择不同的按键,
appt_checkin_dt不为空时的情况
你承认吗
和上一个dischrg_dt'NA'

和datediff(day,prev_contact_dt,cast(appt_checkin_dt as date))如果您的SQL server版本为2012及更高版本,则可以尝试以下功能

Select 
   [PAT_KEY]
 , [VISIT_KEY]
 , [HOSP_ADMIT_DT]
 , CASE 
       WHEN DATEDIFF(d,HOSP_DISCHRG_DT, FollowUpDate) <= 7 THEN 1  -- You may modify this if you want difference by hours
       ELSE 0
       End as FOLLOW_UP
from (SELECT
   *,
   LEAD(SalesQuota, 1,0) OVER (PARTITION BY PAT_KEY ORDER BY VISIT_KEY) AS FollowUpDate -- This will create a new column by getting the value from next row, 
                                                 --assuming that VISIT_KEY is always have higher value compare to previous visit
FROM [ESa611337].dbo.[visit$]
) query
WHERE [HOSP_ADMIT_DT] <> 'NA' 
选择
[拍击键]
,[访问键]
,[HOSP_承认]
案例

当DATEDIFF(d,HOSP_DISCHRG_DT,FollowUpDate)时,如果您的SQL server版本为2012及更高版本,则可以尝试以下功能

Select 
   [PAT_KEY]
 , [VISIT_KEY]
 , [HOSP_ADMIT_DT]
 , CASE 
       WHEN DATEDIFF(d,HOSP_DISCHRG_DT, FollowUpDate) <= 7 THEN 1  -- You may modify this if you want difference by hours
       ELSE 0
       End as FOLLOW_UP
from (SELECT
   *,
   LEAD(SalesQuota, 1,0) OVER (PARTITION BY PAT_KEY ORDER BY VISIT_KEY) AS FollowUpDate -- This will create a new column by getting the value from next row, 
                                                 --assuming that VISIT_KEY is always have higher value compare to previous visit
FROM [ESa611337].dbo.[visit$]
) query
WHERE [HOSP_ADMIT_DT] <> 'NA' 
选择
[拍击键]
,[访问键]
,[HOSP_承认]
案例

当DATEDIFF(d,HOSP_DISCHRG_DT,FollowUpDate)时,Chris,如果我可以的话,我很想帮忙,但在我说得太多之前,我想确保我对您的需求的理解是清楚的

根据提供的数据创建环境:

-- create table variable --

DECLARE @visits TABLE (
    [VISIT_KEY] INT, [PAT_KEY] INT, [DEPT_KEY] INT, [CONTACT_DT_KEY] INT, [APPT_CHECKIN_DT] DATETIME, [HOSP_ADMIT_DT] DATETIME, [HOSP_DISCHRG_DT] DATETIME
);

-- insert data --

INSERT INTO @visits (
    [VISIT_KEY], [PAT_KEY], [DEPT_KEY], [CONTACT_DT_KEY], [APPT_CHECKIN_DT], [HOSP_ADMIT_DT], [HOSP_DISCHRG_DT]
)
VALUES
  ( 85383519, 8208755, 5153, 20150204, '2/4/15 9:03 AM', NULL, NULL )
, ( 85394064, 8208755, 4655, 20150205, NULL, '2/5/15 11:32 AM', '2/8/15 7:09 PM' )
, ( 85482578, 8208755, 4931, 20150213, '2/13/15 2:41 PM', NULL, NULL )
, ( 85687769, 8208755, 4690, 20150325, '3/25/15 1:25 PM', NULL, NULL )
, ( 85706446, 8208755, 4804, 20150325, '3/25/15 1:23 PM', NULL, NULL )
, ( 84492982, 8211959, 4780, 20141221, NULL, '12/21/14 7:22 PM', '12/21/14 9:15 PM' )
, ( 81006886, 8215742, 4923, 20140611, '6/11/14 3:56 PM', NULL, NULL )
, ( 83502242, 8216600, 4777, 20141016, '10/16/14 1:15 PM', NULL, NULL )
, ( 81239904, 8216694, 4995, 20140531, '5/31/14 2:19 PM', NULL, NULL )
, ( 81825248, 8216694, 4655, 20140616, NULL, '6/16/14 9:19 AM', '6/19/14 12:48 PM' )
, ( 81854416, 8216694, 4995, 20141008, '10/8/14 8:59 AM', NULL, NULL )
, ( 83842766, 8216694, 8111, 20141107, NULL, '11/7/14 3:15 AM', '11/10/14 4:45 PM' )
, ( 83883100, 8216694, 4777, 20141113, '11/13/14 2:42 PM ', NULL, NULL )
, ( 85747526, 8216694, 4716, 20150227, NULL, '2/27/15 8:23 AM', '2/28/15 3:04 PM' )
, ( 81342608, 8217928, 4780, 20140514, NULL, '5/14/14 4:07 AM', '5/14/14 5:36 AM' )
, ( 81385263, 8217928, 4780, 20140516, NULL, '5/16/14 2:04 PM', '5/16/14 5:35 PM' )
, ( 82517665, 8218267, 4777, 20140808, '8/8/14 2:36 PM', NULL, NULL )
, ( 81239905, 8220393, 4653, 20140511, '5/11/14 3:44 PM', NULL, NULL )
, ( 86144271, 8223186, 4780, 20150326, NULL, '3/26/15 4:19 PM', '3/26/15 6:28 PM' )
, ( 83012245, 8223203, 4780, 20140914, NULL, '9/14/14 3:38 PM', '9/14/14 8:22 PM' )
, ( 85174511, 8224572, 11611, 20150122, '1/22/15 12:44 PM', NULL, NULL )
, ( 83279874, 8225752, 4780, 20141002, NULL, '10/2/14 9:59 PM', '10/3/14 2:33 AM' )
, ( 84456795, 8227359, 4777, 20141219, '12/19/14 9:05 AM', NULL, NULL )
, ( 85727889, 8227359, 4998, 20150227, NULL, '2/27/15 1:15 PM', '2/28/15 6:40 PM' )
, ( 86017880, 8227509, 5061, 20150319, '3/19/15 2:48 PM', NULL, NULL )
, ( 82909082, 8230810, 11611, 20140912, '9/12/14 8:23 AM', NULL, NULL );
接下来,尝试破译/查询您需要的内容:

患者8216694的83842766就诊是医院入院。出院 日期2014年10月11日16:45。这名患者在就诊时再次入院 83883100于2014年11月13日14:42。因为这不到7天,所以 在该患者的“随访”列中为1。我们只能看到 这是我的第一个病人

更新的查询

SELECT
    ROW_NUMBER() OVER ( PARTITION BY v.PAT_KEY ORDER BY v.PAT_KEY, v.CONTACT_DT_KEY, v.APPT_CHECKIN_DT ) AS VisitRow
    , v.PAT_KEY
    , v.VISIT_KEY
    , v.CONTACT_DT_KEY
    , v.APPT_CHECKIN_DT
    , v.HOSP_ADMIT_DT
    , v.HOSP_DISCHRG_DT
    , LAG( v.HOSP_DISCHRG_DT, 1, NULL ) OVER ( PARTITION BY v.PAT_KEY ORDER BY v.PAT_KEY, v.CONTACT_DT_KEY, v.APPT_CHECKIN_DT ) LastDischarged
    , DATEDIFF (
        dd
        , LAG( v.HOSP_DISCHRG_DT, 1, NULL ) OVER ( PARTITION BY v.PAT_KEY ORDER BY v.PAT_KEY, v.CONTACT_DT_KEY, v.APPT_CHECKIN_DT )
        , v.APPT_CHECKIN_DT
    ) AS DaysFromDischarge
FROM @visits v
WHERE
    v.PAT_KEY = 8216694
ORDER BY
    v.PAT_KEY, v.CONTACT_DT_KEY, v.APPT_CHECKIN_DT;
更新的结果集

+----------+---------+-----------+----------------+-------------------------+-------------------------+-------------------------+-------------------------+-------------------+
| VisitRow | PAT_KEY | VISIT_KEY | CONTACT_DT_KEY |     APPT_CHECKIN_DT     |      HOSP_ADMIT_DT      |     HOSP_DISCHRG_DT     |     LastDischarged      | DaysFromDischarge |
+----------+---------+-----------+----------------+-------------------------+-------------------------+-------------------------+-------------------------+-------------------+
|        1 | 8216694 |  81239904 |       20140531 | 2014-05-31 14:19:00.000 | NULL                    | NULL                    | NULL                    | NULL              |
|        2 | 8216694 |  81825248 |       20140616 | NULL                    | 2014-06-16 09:19:00.000 | 2014-06-19 12:48:00.000 | NULL                    | NULL              |
|        3 | 8216694 |  81854416 |       20141008 | 2014-10-08 08:59:00.000 | NULL                    | NULL                    | 2014-06-19 12:48:00.000 | 111               |
|        4 | 8216694 |  83842766 |       20141107 | NULL                    | 2014-11-07 03:15:00.000 | 2014-11-10 16:45:00.000 | NULL                    | NULL              |
|        5 | 8216694 |  83883100 |       20141113 | 2014-11-13 14:42:00.000 | NULL                    | NULL                    | 2014-11-10 16:45:00.000 | 3                 |
|        6 | 8216694 |  85747526 |       20150227 | NULL                    | 2015-02-27 08:23:00.000 | 2015-02-28 15:04:00.000 | NULL                    | NULL              |
+----------+---------+-----------+----------------+-------------------------+-------------------------+-------------------------+-------------------------+-------------------+
  • 我为这个病人保留了所有的行以供检查,并添加了一个VisitRow来帮助识别一行。第3行和第5行是我认为重要的两行

  • 我还根据订单条款进行了调整,以使用CONTACT_DT_键代替Visite_键

问题:

  • 看着患者8208755,我对滞后的使用产生了疑问。LAG只是查看以前的出院日期记录。(相关的)入住记录是否总是有一个即时的出院记录?您是否可能需要回顾一行以外的内容?如果是这样的话,那么LAG将不会做您在这里希望做的事情

以下是一个使用交叉应用的示例,患者8208755在一行中有多个登记,但没有立即出院。交叉申请只是寻找患者的最后出院日期

-- patient 8208755 using CROSS APPLY --

    SELECT
        ROW_NUMBER() OVER ( PARTITION BY v.PAT_KEY ORDER BY v.PAT_KEY, v.CONTACT_DT_KEY, v.APPT_CHECKIN_DT ) AS VisitRow
        , v.PAT_KEY
        , v.VISIT_KEY
        , v.CONTACT_DT_KEY
        , v.APPT_CHECKIN_DT
        , v.HOSP_ADMIT_DT
        , v.HOSP_DISCHRG_DT
        , dc.LastDischarged
        , DATEDIFF (
            dd
            , dc.LastDischarged
            , v.APPT_CHECKIN_DT
        ) AS DaysFromDischarge
    FROM @visits v
    CROSS APPLY (

        SELECT MAX( HOSP_DISCHRG_DT ) AS LastDischarged FROM @visits x 
        WHERE 
            x.PAT_KEY = v.PAT_KEY  -- current patient record
            AND x.HOSP_DISCHRG_DT < v.APPT_CHECKIN_DT  -- a discharge date prior to check-in

    ) AS dc
    WHERE v.PAT_KEY = 8208755
    ORDER BY
        v.PAT_KEY, v.CONTACT_DT_KEY, v.APPT_CHECKIN_DT;

此查询查找患者的最早出院日期,然后返回该日期。在这种情况下:2015-02-08 19:09:00.000

克里斯,如果可以的话,我很乐意帮忙,但在我说得太多之前,我想确保我对您的需求的理解是清楚的

根据提供的数据创建环境:

-- create table variable --

DECLARE @visits TABLE (
    [VISIT_KEY] INT, [PAT_KEY] INT, [DEPT_KEY] INT, [CONTACT_DT_KEY] INT, [APPT_CHECKIN_DT] DATETIME, [HOSP_ADMIT_DT] DATETIME, [HOSP_DISCHRG_DT] DATETIME
);

-- insert data --

INSERT INTO @visits (
    [VISIT_KEY], [PAT_KEY], [DEPT_KEY], [CONTACT_DT_KEY], [APPT_CHECKIN_DT], [HOSP_ADMIT_DT], [HOSP_DISCHRG_DT]
)
VALUES
  ( 85383519, 8208755, 5153, 20150204, '2/4/15 9:03 AM', NULL, NULL )
, ( 85394064, 8208755, 4655, 20150205, NULL, '2/5/15 11:32 AM', '2/8/15 7:09 PM' )
, ( 85482578, 8208755, 4931, 20150213, '2/13/15 2:41 PM', NULL, NULL )
, ( 85687769, 8208755, 4690, 20150325, '3/25/15 1:25 PM', NULL, NULL )
, ( 85706446, 8208755, 4804, 20150325, '3/25/15 1:23 PM', NULL, NULL )
, ( 84492982, 8211959, 4780, 20141221, NULL, '12/21/14 7:22 PM', '12/21/14 9:15 PM' )
, ( 81006886, 8215742, 4923, 20140611, '6/11/14 3:56 PM', NULL, NULL )
, ( 83502242, 8216600, 4777, 20141016, '10/16/14 1:15 PM', NULL, NULL )
, ( 81239904, 8216694, 4995, 20140531, '5/31/14 2:19 PM', NULL, NULL )
, ( 81825248, 8216694, 4655, 20140616, NULL, '6/16/14 9:19 AM', '6/19/14 12:48 PM' )
, ( 81854416, 8216694, 4995, 20141008, '10/8/14 8:59 AM', NULL, NULL )
, ( 83842766, 8216694, 8111, 20141107, NULL, '11/7/14 3:15 AM', '11/10/14 4:45 PM' )
, ( 83883100, 8216694, 4777, 20141113, '11/13/14 2:42 PM ', NULL, NULL )
, ( 85747526, 8216694, 4716, 20150227, NULL, '2/27/15 8:23 AM', '2/28/15 3:04 PM' )
, ( 81342608, 8217928, 4780, 20140514, NULL, '5/14/14 4:07 AM', '5/14/14 5:36 AM' )
, ( 81385263, 8217928, 4780, 20140516, NULL, '5/16/14 2:04 PM', '5/16/14 5:35 PM' )
, ( 82517665, 8218267, 4777, 20140808, '8/8/14 2:36 PM', NULL, NULL )
, ( 81239905, 8220393, 4653, 20140511, '5/11/14 3:44 PM', NULL, NULL )
, ( 86144271, 8223186, 4780, 20150326, NULL, '3/26/15 4:19 PM', '3/26/15 6:28 PM' )
, ( 83012245, 8223203, 4780, 20140914, NULL, '9/14/14 3:38 PM', '9/14/14 8:22 PM' )
, ( 85174511, 8224572, 11611, 20150122, '1/22/15 12:44 PM', NULL, NULL )
, ( 83279874, 8225752, 4780, 20141002, NULL, '10/2/14 9:59 PM', '10/3/14 2:33 AM' )
, ( 84456795, 8227359, 4777, 20141219, '12/19/14 9:05 AM', NULL, NULL )
, ( 85727889, 8227359, 4998, 20150227, NULL, '2/27/15 1:15 PM', '2/28/15 6:40 PM' )
, ( 86017880, 8227509, 5061, 20150319, '3/19/15 2:48 PM', NULL, NULL )
, ( 82909082, 8230810, 11611, 20140912, '9/12/14 8:23 AM', NULL, NULL );
接下来,尝试破译/查询您需要的内容:

患者8216694的83842766就诊是医院入院。出院 日期2014年10月11日16:45。这名患者在就诊时再次入院 83883100于2014年11月13日14:42。因为这不到7天,所以 在该患者的“随访”列中为1。我们只能看到 这是我的第一个病人

更新的查询

SELECT
    ROW_NUMBER() OVER ( PARTITION BY v.PAT_KEY ORDER BY v.PAT_KEY, v.CONTACT_DT_KEY, v.APPT_CHECKIN_DT ) AS VisitRow
    , v.PAT_KEY
    , v.VISIT_KEY
    , v.CONTACT_DT_KEY
    , v.APPT_CHECKIN_DT
    , v.HOSP_ADMIT_DT
    , v.HOSP_DISCHRG_DT
    , LAG( v.HOSP_DISCHRG_DT, 1, NULL ) OVER ( PARTITION BY v.PAT_KEY ORDER BY v.PAT_KEY, v.CONTACT_DT_KEY, v.APPT_CHECKIN_DT ) LastDischarged
    , DATEDIFF (
        dd
        , LAG( v.HOSP_DISCHRG_DT, 1, NULL ) OVER ( PARTITION BY v.PAT_KEY ORDER BY v.PAT_KEY, v.CONTACT_DT_KEY, v.APPT_CHECKIN_DT )
        , v.APPT_CHECKIN_DT
    ) AS DaysFromDischarge
FROM @visits v
WHERE
    v.PAT_KEY = 8216694
ORDER BY
    v.PAT_KEY, v.CONTACT_DT_KEY, v.APPT_CHECKIN_DT;
更新的结果集

+----------+---------+-----------+----------------+-------------------------+-------------------------+-------------------------+-------------------------+-------------------+
| VisitRow | PAT_KEY | VISIT_KEY | CONTACT_DT_KEY |     APPT_CHECKIN_DT     |      HOSP_ADMIT_DT      |     HOSP_DISCHRG_DT     |     LastDischarged      | DaysFromDischarge |
+----------+---------+-----------+----------------+-------------------------+-------------------------+-------------------------+-------------------------+-------------------+
|        1 | 8216694 |  81239904 |       20140531 | 2014-05-31 14:19:00.000 | NULL                    | NULL                    | NULL                    | NULL              |
|        2 | 8216694 |  81825248 |       20140616 | NULL                    | 2014-06-16 09:19:00.000 | 2014-06-19 12:48:00.000 | NULL                    | NULL              |
|        3 | 8216694 |  81854416 |       20141008 | 2014-10-08 08:59:00.000 | NULL                    | NULL                    | 2014-06-19 12:48:00.000 | 111               |
|        4 | 8216694 |  83842766 |       20141107 | NULL                    | 2014-11-07 03:15:00.000 | 2014-11-10 16:45:00.000 | NULL                    | NULL              |
|        5 | 8216694 |  83883100 |       20141113 | 2014-11-13 14:42:00.000 | NULL                    | NULL                    | 2014-11-10 16:45:00.000 | 3                 |
|        6 | 8216694 |  85747526 |       20150227 | NULL                    | 2015-02-27 08:23:00.000 | 2015-02-28 15:04:00.000 | NULL                    | NULL              |
+----------+---------+-----------+----------------+-------------------------+-------------------------+-------------------------+-------------------------+-------------------+
  • 我为这个病人保留了所有的行以供检查,并添加了一个VisitRow来帮助识别一行。第3行和第5行是我认为重要的两行

  • 我还根据订单条款进行了调整,以使用CONTACT_DT_键代替Visite_键

问题:

  • 看着患者8208755,我对滞后的使用产生了疑问。LAG只是查看以前的记录