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
吗?太好了,先生,我不知道如何感谢您。愿上帝保佑你