【问题标题】:How to join SQL table to itself, based on the previous record?如何根据之前的记录将 SQL 表连接到自身?
【发布时间】:2019-11-22 01:31:54
【问题描述】:

我在 SQL Server 2016 中有以下行:

ID是给病人的,LogID是记录的唯一id,是一个标识列。

我怎样才能得到日期被更改的患者的FirstVisitDate

根据图像中的数据,查询应返回 logID 为 3 的行(因为患者的 firstVisitDate 已更改为上一条记录),以及 logID 为 5 的行。

即:

3--2
5--3

这意味着 logID 为 3 的行已从其先前的 logid=2 更改,而具有 logID 5 的记录已从其先前的记录更改为 logid=3

【问题讨论】:

    标签: sql sql-server window-functions


    【解决方案1】:

    您可以使用LAG 获取每个患者的FirstVisitDate 的先前值,并将其与当前值进行比较以查看它是否已更改:

    SELECT *
    FROM (SELECT *, LAG(FirstVisitDate) OVER (PARTITION BY id ORDER BY LogID) AS prev_FVD
          FROM visits) v
    WHERE FirstVisitDate != prev_FVD
    

    Demo on dbfiddle

    【讨论】:

    • 太棒了!谢谢!,如果你能添加它是如何工作的解释,将是惊人的。再次感谢
    • @HasanShouman 我很高兴能帮上忙。如果您查看更新后的演示链接,您会看到子查询正在为每个患者 ID 生成上一个列表(基于 LogIDFirstVisitDate(这就是 LAG(FirstVisitDate) OVER (PARTITION BY id ORDER BY LogID) 的一部分查询)。在外部查询中,我们简单地比较这些值以查找 FirstVisitDate 更改的行。请注意,由于与NULL 的比较始终为假,因此不会显示第一行(没有先前的FirstVisitDate)。
    【解决方案2】:

    据我了解,您不能自行加入表格,您可以使用别名,如下所示

    SELECT * 
       FROM 
         PATIENT P JOIN PATIENT P_N ON P.LOGID = PN.LOGID
       WHERE P.FirstVisitDate <> PN.FirstVisitDate 
       ORDER BY P.FirstVisitDate;
    

    您必须根据需要更新 where 子句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多