2017-02-16 74 views
-1

我有一个这样的表。在SQL Server 2012中选择连续ID

ID    Installment ID  DateDue 
------------------------------------------------------------  
000000000008 29     2017-03-15 00:00:00.000 
000000000008 30     2017-04-15 00:00:00.000 
000000000008 32     2017-06-15 00:00:00.000 
000000000008 33     2017-07-15 00:00:00.000 
000000000008 34     2017-08-15 00:00:00.000 

我需要的是什么(所以在这个例子32,33,34)返回上只有3个连续成功分期付款的数据,在特定日期范围之间的选择查询。

假设失败在另一个表(31)中填充。

所以我想要一个序列号,分期付款ID的返回。

+0

6,6,7 - 连续的? – DarkKnight

+0

对不起,纠正。 6,7,8 –

+0

如果您有3,4,6,7,8,9,它应该返回什么? – DarkKnight

回答

0

您可以使用SqlServer 2012中的LEADLAG函数,并且可以这样做。

Demo here

;WITH cte1 AS 
(
SELECT * , datepart(m,(lead(datedue) OVER(ORDER BY installmentid)))-DATEPART(m,datedue) nowtonext 
     ,DATEPART(m,datedue)-datepart(m,(lag(datedue) OVER(ORDER BY installmentid))) prevtonow 
     ,ROW_NUMBER() OVER(ORDER BY installmentid) as rn 
FROM YourTable 
), 
cte2 AS 
(
SELECT rn,id,installmentid,datedue,nowtonext,prevtonow 
     ,lead(prevtonow) OVER(ORDER BY rn) AS prev 
     ,lag(nowtonext) OVER(ORDER BY rn) AS nxt 
FROM cte1 
) 

SELECT id,installmentid,datedue 
FROM cte1 
WHERE rn BETWEEN (SELECT rn-1 FROM cte2 WHERE nowtonext = 1 AND prevtonow=1 AND prev=1 AND nxt=1) 
      and (SELECT rn+1 FROM cte2 WHERE nowtonext = 1 AND prevtonow=1 AND prev=1 AND nxt=1) 
0

您可以使用下面的查询,以返回其连续InstallmentID数的连续记录的岛屿:

;WITH CTE_Group AS (
    SELECT ID, 
      InstallmentID, 
      DateDue, 
      ROW_NUMBER() OVER (PARTITION BY ID 
          ORDER BY DateDue) - InstallmentID AS grp 
    FROM mytable 
    WHERE DateDue BETWEEN @startDate AND @endDate 
), CTE_Count AS (
    SELECT ID, InstallmentID, DateDue, 
      COUNT(*) OVER (PARTITION BY ID, grp) AS cnt 
    FROM CTE_Group 
) 
SELECT ID, InstallmentID, DateDue 
FROM CTE_Count 
WHERE cnt >= 3 

如果你想只有3记录了每个岛的,然后您可以使用ROW_NUMBERPARTITION BY cnt条款来提取该岛的前3条记录。

说明:第一CTE,CTE_Group的查询,以便识别具有预定时间范围(​​)内的连续InstallmentID号码连续记录使用“行号特技之间差”。从CTE_Group

输出:

ID InstallmentID DateDue  grp 
------------------------------------ 
8 29    2017-03-15 -28 
8 30    2017-04-15 -28 
8 32    2017-06-15 -29 
8 33    2017-07-15 -29 
8 34    2017-08-15 -29 

第二CTE,CTE_Count的查询,以便计算每个岛的人口使用COUNT() OVER()。从CTE_Count

输出:

ID InstallmentID DateDue  Cnt 
----------------------------------- 
8 32    2017-06-15 3 
8 33    2017-07-15 3 
8 34    2017-08-15 3 
8 29    2017-03-15 2 
8 30    2017-04-15 2 

使用CTE_Count,我们可以很容易地筛选出属于具有2以下的人口的岛屿记录。

Demo here