Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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表中查找n个连续值(其中regStatus=0),假设我给出3,则必须返回3个连续记录_Sql Server_Sql Server 2008_Select - Fatal编程技术网

Sql server 如何在我的SQL Server表中查找n个连续值(其中regStatus=0),假设我给出3,则必须返回3个连续记录

Sql server 如何在我的SQL Server表中查找n个连续值(其中regStatus=0),假设我给出3,则必须返回3个连续记录,sql-server,sql-server-2008,select,Sql Server,Sql Server 2008,Select,为了您的方便,我正在显示我的数据和期望的输出 DECLARE @TResults TABLE ( keyId INT, peopleId INT, sesnId INt, sesName nvarchar(max), sesOrder

为了您的方便,我正在显示我的数据和期望的输出

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  
上述命令的输出如下

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  
现在我想要的是,假设我给2。它必须从regStatus=0的每个empid返回2条连续记录

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  
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  

注意

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项记录。但它们是连续的,我们要求返回两个连续记录

假设我给3。它必须从regStatus=0的每个empid返回3条连续记录

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  
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。它必须从regStatus=0的每个empid返回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  
19      338143      170     5 Mar, 2016  5             0  
20      338143      231     6 Mar, 2016  6             0  
21     338143       232     7 Mar, 2016  7             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  

请帮助我实现这一点。

使用
行数的差值
s:

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

如果
N=2
,不应该包括
KeyId=21
吗?太好了,先生,我不知道如何感谢您。愿上帝保佑你