2017-02-16 18 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()を使用しています。私たちは簡単に2以下の人口を持つ島々に属するレコードをフィルタリングすることができ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から

出力。

Demo here

関連する問題