如何根据之前的记录将 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 生成上一个列表(基于LogID
)FirstVisitDate
(这就是 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 - 如何使用父表中的值将连接表连接到另一个连接表?