【问题标题】:How to find n consecutive values (Where regStatus = 0) in my SQL Server table Suppose if i give 3, then 3 consecutive records must be returned如何在我的 SQL Server 表中找到 n 个连续值(其中 regStatus = 0)假设如果我给 3,则必须返回 3 个连续记录
【发布时间】:2016-04-01 04:34:40
【问题描述】:

为了您的方便,我将显示我的数据和所需的输出。

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

注意

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

假设如果我给 3。它必须从每个 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  
19      338143      170     5 Mar, 2016  5             0  
20      338143      231     6 Mar, 2016  6             0  
21     338143       232     7 Mar, 2016  7             0  

假设如果我给 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  
7       169199      232     7 Mar, 2016  7             0  

请帮助我实现这一目标。

【问题讨论】:

  • 如果N = 2 不应该包含KeyId = 21

标签: sql-server sql-server-2008 select


【解决方案1】:

使用ROW_NUMBERs 的差异:

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

【讨论】:

  • 优秀的先生,我不知道如何感谢您。愿上帝保佑你
猜你喜欢
  • 1970-01-01
  • 2012-12-20
  • 2021-10-30
  • 1970-01-01
  • 2018-10-23
  • 2018-12-01
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
相关资源
最近更新 更多