Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 根据SQL Server中的日期和规则标识记录的子集_Sql Server_Tsql_Select_Sql Server 2012 - Fatal编程技术网

Sql server 根据SQL Server中的日期和规则标识记录的子集

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

我的数据集如下所示:

我需要识别链接集为1的行,但在按ToDate降序排序时,它们仅在一起的位置,如图所示

换言之,我希望能够识别这些记录(编辑过的):

这是一个简化的数据集,事实上会有更多的记录

定义记录是否链接的逻辑是,记录的起始日期是否在前一日期的8周内……但这是测试数据,因此可能并不完美

最好的方法是什么?

您可以使用
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的行