当另一个表中的另一条记录满足日期/时间条件时,在SQL中重新编码值
我试图用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
- 1如果患者在出院后7天内进行门诊就诊
- 如果他们在7天内没有门诊就诊,则为0
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只是查看以前的记录