Sql server 根据SQL Server中的日期和规则标识记录的子集
我的数据集如下所示: 我需要识别链接集为1的行,但在按ToDate降序排序时,它们仅在一起的位置,如图所示 换言之,我希望能够识别这些记录(编辑过的): 这是一个简化的数据集,事实上会有更多的记录 定义记录是否链接的逻辑是,记录的起始日期是否在前一日期的8周内……但这是测试数据,因此可能并不完美 最好的方法是什么?您可以使用Sql server 根据SQL Server中的日期和规则标识记录的子集,sql-server,tsql,select,sql-server-2012,Sql Server,Tsql,Select,Sql Server 2012,我的数据集如下所示: 我需要识别链接集为1的行,但在按ToDate降序排序时,它们仅在一起的位置,如图所示 换言之,我希望能够识别这些记录(编辑过的): 这是一个简化的数据集,事实上会有更多的记录 定义记录是否链接的逻辑是,记录的起始日期是否在前一日期的8周内……但这是测试数据,因此可能并不完美 最好的方法是什么?您可以使用LAG()和LEAD()分析函数: SELECT * FROM ( SELECT t.*, LAG(t.linked,1,0) OVER(O
LAG()
和LEAD()
分析函数:
SELECT * FROM (
SELECT t.*,
LAG(t.linked,1,0) OVER(ORDER BY t.FromDate DESC) as rnk_1, --Next one
LEAD(t.linked,1,0) OVER(ORDER BY t.FromDate DESC) as rnk_2, -- Last one,
LEAD(t.linked,2,0) OVER(ORDER BY t.FromDate DESC) as rnk_3 -- Last two,
FROM YourTable t) s
WHERE ((s.rnk_1 = 1 OR s.rnk_2 = 1) AND s.linked = 1) OR
(s.rnk_2 = 1 and s.rnk_3 = 1 and s.linked = 0)
ORDER BY s.FromDate DESC
这将导致记录具有
linked=1
,上一条/下一条记录也是1。使用LAG
和LEAD
功能,您可以在给定排序条件的情况下检查上一行/下一行值
您可以使用以下DDL实现所需的数据集:
;
WITH CTE_LagLead
AS (
SELECT FromDate,
ToDate,
NoOfDays,
Weeks,
Linked,
LAG(Linked, 1, 0) OVER (ORDER BY ToDate DESC) LinkedLag,
LEAD(Linked, 1, 0) OVER (ORDER BY ToDate DESC) LinkedLead
FROM @table
)
SELECT FromDate,
ToDate,
NoOfDays,
Weeks,
Linked
FROM CTE_LagLead
WHERE Linked = 1 AND
(LinkedLag = 1 OR
LinkedLead = 1)
ORDER BY ToDate DESC;
以下是我的答案:
Select
*
from
#tmpAbsences
where
idcol between 1 AND (
Select TOP 1 idcol from #tmpAbsences where Linked=0)
这包括下图中的第7行:
这和我的答案不一样吗?是的,差不多一样,投票支持更快的打字机:)@ChrisPickford:我编辑了我的问题,我的同事澄清说,我们需要包括
Linked=0
的行,谢谢这个-快速问题-不应该是按s.FromDate DESC排序吗?哦,没有看到:P Yea@OurManInBananas我不得不尝试另一种方法,因为这种方法不包括Linked=0
的行。就在最近一组链接记录编辑我的问题之前,我的同事澄清说,我们需要现在就尝试包括Linked=0
@OurManInBananas的行