2016-04-01 3 views
1

データと必要な出力を表示します。SQL Serverのテーブルでn個の連続した値を検索する方法(regStatus = 0の場合)3を指定した場合、3つの連続するレコードを返す必要があるとします。

上記のコマンドの出力は、この

keyId peopleId sesnId sesName  sesOrder **regStatus** 
1  169199  166  1 Mar, 2016 1    0 
2  169199  167  2 Mar, 2016 2    1 
3  169199  168  3 Mar, 2016 3    1 
4  169199  169  4 Mar, 2016 4    0 
5  169199  170  5 Mar, 2016 5    0 
6  169199  231  6 Mar, 2016 6    0 
7  169199  232  7 Mar, 2016 7    0 
8  297067  166  1 Mar, 2016 1    0 
9  297067  167  2 Mar, 2016 2    1 
10  297067  168  3 Mar, 2016 3    0 
11  297067  169  4 Mar, 2016 4    0 
12  297067  170  5 Mar, 2016 5    1 
13  297067  231  6 Mar, 2016 6    0 
14  297067  232  7 Mar, 2016 7    0 
15  338143  166  1 Mar, 2016 1    1 
16  338143  167  2 Mar, 2016 2    1 
17  338143  168  3 Mar, 2016 3    0 
18  338143  169  4 Mar, 2016 4    1 
19  338143  170  5 Mar, 2016 5    0 
20  338143  231  6 Mar, 2016 6    0 
21  338143  232  7 Mar, 2016 7    0 

のようになります

DECLARE @TResults TABLE 
      (
       keyId INT,   
       peopleId INT,     
       sesnId  INt, 
       sesName  nvarchar(max), 
       sesOrder int, 
       regStatus int 
      ) 
INSERT @TResults 
SELECT 1,  169199,  166, '1 Mar, 2016', 1, 0 UNION ALL 
SELECT 2,  169199,  167, '2 Mar, 2016', 2, 1 UNION ALL 
SELECT 3,  169199,  168, '3 Mar, 2016', 3, 1 UNION ALL 
SELECT 4,  169199,  169, '4 Mar, 2016', 4, 0 UNION ALL 
SELECT 5,  169199,  170, '5 Mar, 2016', 5, 0 UNION ALL 
SELECT 6,  169199,  231, '6 Mar, 2016', 6, 0 UNION ALL 
SELECT 7,  169199,  232, '7 Mar, 2016', 7, 0 UNION ALL 
SELECT 8,  297067,  166, '1 Mar, 2016', 1, 0 UNION ALL 
SELECT 9,  297067,  167, '2 Mar, 2016', 2, 1 UNION ALL 
SELECT 10,  297067,  168, '3 Mar, 2016', 3, 0 UNION ALL 
SELECT 11,  297067,  169, '4 Mar, 2016', 4, 0 UNION ALL 
SELECT 12,  297067,  170, '5 Mar, 2016', 5, 1 UNION ALL 
SELECT 13,  297067,  231, '6 Mar, 2016', 6, 0 UNION ALL 
SELECT 14,  297067,  232, '7 Mar, 2016', 7, 0 UNION ALL 
SELECT 15,  338143,  166, '1 Mar, 2016', 1, 1 UNION ALL 
SELECT 16,  338143,  167, '2 Mar, 2016', 2, 1 UNION ALL 
SELECT 17,  338143,  168, '3 Mar, 2016', 3, 0 UNION ALL 
SELECT 18,  338143,  169, '4 Mar, 2016', 4, 1 UNION ALL 
SELECT 19,  338143,  170, '5 Mar, 2016', 5, 0 UNION ALL 
SELECT 20,  338143,  231, '6 Mar, 2016', 6, 0 UNION ALL 
SELECT 21,  338143,  232, '7 Mar, 2016', 7, 0 

SELECT * FROM @TResults 

今私が欲しい私は2を与える場合、それは= 0

regStatusでそれぞれEMPIDから2連続でレコードを返さなければならないと仮定し、あります

ex。

keyId peopleId sesnId sesName  sesOrder **regStatus** 
4  169199  169  4 Mar, 2016 4    0 
5  169199  170  5 Mar, 2016 5    0 
6  169199  231  6 Mar, 2016 6    0 
7  169199  232  7 Mar, 2016 7    0 

は4つのレコードを持っていることを

keyId peopleId sesnId sesName  sesOrder **regStatus** 
4  169199  169  4 Mar, 2016 4    0 
5  169199  170  5 Mar, 2016 5    0 
6  169199  231  6 Mar, 2016 6    0 
7  169199  232  7 Mar, 2016 7    0 
10  297067  168  3 Mar, 2016 3    0 
11  297067  169  4 Mar, 2016 4    0 
13  297067  231  6 Mar, 2016 6    0 
14  297067  232  7 Mar, 2016 7    0 
19  338143  170  5 Mar, 2016 5    0 
20  338143  231  6 Mar, 2016 6    0 

は注意してください。しかし、彼らは連続しており、我々は2つの連続した記録を返すように求めていた。

OR

私は3を与えるとそれは私が4を与える場合は、各EMPIDから4連続でレコードを返さなければならないとしregStatus = 0

keyId peopleId sesnId sesName  sesOrder **regStatus** 
4  169199  169  4 Mar, 2016 4    0 
5  169199  170  5 Mar, 2016 5    0 
6  169199  231  6 Mar, 2016 6    0 
19  338143  170  5 Mar, 2016 5    0 
20  338143  231  6 Mar, 2016 6    0 
21  338143  232  7 Mar, 2016 7    0 

とそれぞれEMPIDから3連続でレコードを返さなければならないと仮定regStatus = 0の場合

keyId peopleId sesnId sesName  sesOrder **regStatus** 
4  169199  169  4 Mar, 2016 4    0 
5  169199  170  5 Mar, 2016 5    0 
6  169199  231  6 Mar, 2016 6    0 
7  169199  232  7 Mar, 2016 7    0 

これを達成するために手伝ってください。 ROW_NUMBER秒の差を利用し

+0

は' KEYID = 21'含めるべきではありませんか? –

答えて

1

: `N = 2`場合

DECLARE @N INT = 2; 

WITH Cte AS(
    SELECT *, 
     rn = ROW_NUMBER() OVER(PARTITION BY peopleId ORDER BY sesOrder), 
     rn2 = ROW_NUMBER() OVER(PARTITION BY peopleId ORDER BY sesOrder) 
       - ROW_NUMBER() OVER(PARTITION BY peopleId, regStatus ORDER BY sesOrder) 
    FROM @TResults 
), 
Cte2 AS(
    SELECT *, 
     grp = rn - ((ROW_NUMBER() OVER(PARTITION BY peopleId, rn2 ORDER BY sesOrder) - 1) % @N) 
    FROM Cte 
    WHERE regStatus = 0 
), 
CteFinal AS(
    SELECT *, 
     cnt = COUNT(*) OVER(PARTITION BY peopleId, rn2, grp) 
    FROM Cte2 
) 
SELECT 
    keyId, peopleId, sesnId, sesName, sesOrder, regStatus 
FROM CteFinal 
WHERE cnt = @N 

ONLINE DEMO

+1

優れた解決策 – Squirrel

+0

優秀な先生、どうもありがとうございます。神があなたを祝福する –

関連する問題