如何根据之前的记录将 SQL 表连接到自身?

Posted

技术标签:

【中文标题】如何根据之前的记录将 SQL 表连接到自身?【英文标题】:How to join SQL table to itself, based on the previous record? 【发布时间】: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

【问题讨论】:

【参考方案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 子句。

【讨论】:

以上是关于如何根据之前的记录将 SQL 表连接到自身?的主要内容,如果未能解决你的问题,请参考以下文章

如何将学生和评估表连接到一个视图中?

如何强制 SQL Server 2005 在 where 之前运行连接?

mysql - 如何使用父表中的值将连接表连接到另一个连接表?

如何将两个事实表连接到一维表

Hibernate:如何在注释中将三个 3 表连接到一个连接表中?

What Joins 用于将多个表连接到一个视图中