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

时间:2018-08-17 22:33:22

标签: sql sql-server

我已经搜索过,但是没有找到任何能够帮助我解决这个问题的内容。任何帮助都会很棒。

尝试在SQL中回答此问题:

创建Follow_Up:

  • 如果出院后7天内发现患者进行了门诊就诊
  • 如果7天内没有看门诊,则为0。

应在第7天的任何时间对患者进行标记(例如,在2015年2月6日凌晨2点前往急诊室就诊的患者,在2015年2月13日进行门诊随访即使5PM间隔超过168小时,也应将其标记为在7天内进行门诊。

下面是一些样例数据和到目前为止的代码。我认为这也应该是一个子查询。请注意,下面的数据示例是我要查找的与其他代码不同的表,这就是为什么我认为需要子查询的原因。

注意:门诊记录将没有Hosp_admit_dtHosp_admit_dt将没有约会签入。另外,请注意,行可以按任何顺序排列。没有给定的偏移量。每个PAT_KEY的记录数都是随机的。到目前为止,答案似乎需要特定的偏移量。我不确定我是否会创建一个。

非常感谢您的帮助。

示例:查看以下内容:

患者83842766的访问8216694是医院承认的。 11/10/2014 16:45的出院日期。在访问83883100的{​​{1}}时再次接纳了该患者。由于这是不到7天的时间,因此在访问11/13/2014 14:42行中,该患者的1列中会有一个Follow_Up

83842766

样本数据:

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

3 个答案:

答案 0 :(得分:2)

如果您的SQL Server版本是2012及更高版本,则可以尝试使用LEAD函数,如下所示

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' 

答案 1 :(得分:0)

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

select distinct pat_key,
case when appt_checkin_dt is not null 
          and hosp_admit_dt='NA' 
          and prev_dischrg_dt<>'NA' 
          and datediff(day,prev_contact_dt,cast(appt_checkin_dt as date))<=7 
     then 1 
     else 0 
end as follow_up
from (SELECT t.*
            ,lag(contact_dt_key) over(partition by pat_key order by contact_dt_key) as prev_contact_dt
            ,lag(hosp_dischrg_dt) over(partition by pat_key order by contact_dt_key) as prev_dischrg_dt
      FROM [ESa611337].dbo.[visit$] t
     ) t 

该解决方案假定您使用的是SQL Sever 2012版或更高版本,并且能够使用lag窗口函数。

答案 2 :(得分:0)

克里斯,如果可以的话,我想提供帮助,但是在我进一步介绍之前,我想确保我对您的需求的理解清楚。

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

-- 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。放电   日期为11/10/2014 16:45。该患者在再次就诊时再次入院   83883100,2014年11月13日14:42。由于这是不到7天,因此   在该患者的Follow_Up列中为1。我们只能看到   病人编号为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行。

  • 我还调整了ORDER BY子句以使用CONTACT_DT_KEY代替VISIT_KEY。

问题:

  • 看着患者8208755使我对LAG的使用提出了质疑。 LAG仅查看先前的记录以了解出院日期。 (相关的)登机记录是否会始终具有始终的即时出院记录?您是否可能需要回首更多行?如果是这样,那么LAG将不会执行您在这里想要做的事情。

以下是在患者8208755连续多次签入且没有立即出院的情况下使用CROSS APPLY的示例。 CROSS APPLY只是在寻找患者的最后出院日期。

-- 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;

交叉应用患者8208755(所有行)的结果:

+----------+---------+-----------+----------------+-------------------------+-------------------------+-------------------------+-------------------------+-------------------+
    | VisitRow | PAT_KEY | VISIT_KEY | CONTACT_DT_KEY |     APPT_CHECKIN_DT     |      HOSP_ADMIT_DT      |     HOSP_DISCHRG_DT     |     LastDischarged      | DaysFromDischarge |
    +----------+---------+-----------+----------------+-------------------------+-------------------------+-------------------------+-------------------------+-------------------+
    |        1 | 8208755 |  85383519 |       20150204 | 2015-02-04 09:03:00.000 | NULL                    | NULL                    | NULL                    | NULL              |
    |        2 | 8208755 |  85394064 |       20150205 | NULL                    | 2015-02-05 11:32:00.000 | 2015-02-08 19:09:00.000 | NULL                    | NULL              |
    |        3 | 8208755 |  85482578 |       20150213 | 2015-02-13 14:41:00.000 | NULL                    | NULL                    | 2015-02-08 19:09:00.000 | 5                 |
    |        4 | 8208755 |  85706446 |       20150325 | 2015-03-25 13:23:00.000 | NULL                    | NULL                    | 2015-02-08 19:09:00.000 | 45                |
    |        5 | 8208755 |  85687769 |       20150325 | 2015-03-25 13:25:00.000 | NULL                    | NULL                    | 2015-02-08 19:09:00.000 | 45                |
    +----------+---------+-----------+----------------+-------------------------+-------------------------+-------------------------+-------------------------+-------------------+

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