查找与SQL Server中的条件匹配的最近行

时间:2018-03-01 00:05:02

标签: sql-server

我有一个带有唯一ID的SQL表,一个医疗保健遭遇的服务日期,以及这次遭遇是急诊室访问(ed = 1)还是住院(hosp = 1)。

对于每个唯一ID,我想确定从住院时间<= 1个日历日发生的ED就诊。

因此,我想我要问SQL首先识别ED就诊,然后上下搜索以找到最近的住院时间并计算日期差异(绝对值)。我熟悉lag / lead和rownumber()函数,但似乎无法解决这个问题。

任何想法都将不胜感激!谢谢!

对于一个说明性ID,表格如下所示:

id     date          ed  hosp       
1      2012-01-01    0   1      
1      2012-01-05    1   0
1      2012-02-01    0   1 
1      2012-02-03    1   0  
1      2012-05-01    0   0

我想创建一个新列(ed_hosp_diff),这是每次ED就诊和最近住院之间的最小绝对日期差异(天数),如下所示:

id     date          ed  hosp  ed_hosp_diff     
1      2012-01-01    0   1     null 
1      2012-01-05    1   0     4
1      2012-02-01    0   1     null
1      2012-02-03    1   0     2
1      2012-05-01    0   0     null

2 个答案:

答案 0 :(得分:1)

因此,这并不能显示您显示的输出表,但它符合您列出的要求:

  

对于每个唯一ID,我想识别发生的ED访问&lt; = 1   从住院的日历日。

您的输出表并没有真正为您提供 - 它包含ED访问的行,这些行不具有匹配的医院许可,并且包含医院许可的行等。此SQL不具备此功能。给你这些,它只是给你ED访问,然后在一天内医院承认。

它也没有给你带有负面日期的匹配 - 在ED就诊之前进行医院就诊的情况(就医疗保健分析而言,这通常与寻找ED访问时的情况不同)知识产权承认)。如果您确实需要这些,请删除主查询的WHERE子句中的最后一位逻辑。

SELECT
    ID              =   e.id,
    ED_DATE         =   e.date,
    HOSP_DATE       =   h.date
    ED_HOSP_DIFF    =   DATEDIFF(dd, e.date, h.date)    
FROM 
    Table1 AS e
JOIN
    (
    SELECT
        id,
        date
    FROM
        Table1
    WHERE
        hosp = 1
    ) AS h
ON
    e.id = h.id
WHERE
    e.ed = 1
AND
    DATEDIFF(dd, e.date, h.date) <= 1
AND 
    DATEDIFF(dd, e.date, h.date) >= 0

答案 1 :(得分:-1)

使用OUTER APPLY获取ed = 1的记录并找到min date diff

SELECT *
FROM  table t
      OUTER APPLY
      (
          SELECT ed_hosp_diff = MIN ( ABS ( DATEDIFF(DAY, t.date, x.date) ) )
          FROM   table x
          WHERE  x.date <> t.date
          AND    x.ed = 1
      ) eh