Maz*_*har 13 t-sql sql-server sql-server-2008-r2
我在SQLServer 2008r2中有一个表,如下所示.
我想选择[Fg]列= 1的所有记录,其中每个记录连续按[Id]顺序导入每个[T_Id]和[N_Id]组合的值2 .
可能存在[Fg]= 2 之前的记录不= 1的情况
可以有任意数量的记录,其值[Fg]= 1,但只有一个记录,其中[Fg]每个记录= 2 [T_Id]和[N_Id]组合.
因此,对于下面的示例,我想选择带有[Id]s(4,5)和(7,8,9)和(19,20)的记录.
[T_Id]不包括3和4的任何记录.
预期产出
示例数据集
DECLARE @Data TABLE ( Id INT IDENTITY (1,1), T_Id INT, N_Id INT, Fg TINYINT )
INSERT INTO @Data
(T_Id, N_Id, Fg)
VALUES
(1, 2, 0), (1, 2, 1), (1, 2, 0), (1, 2, 1), (1, 2, 2), (2, 3, 0), (2, 3, 1),
(2, 3, 1), (2, 3, 2), (3, 4, 0), (3, 4, 0), (3, 4, 0), (3, 4, 2), (4, 5, 0),
(4, 5, 1), (4, 5, 0), (4, 5, 2), (5, 7, 0), (5, 7, 1), (5, 7, 2)
Run Code Online (Sandbox Code Playgroud)
got*_*tqn 12
可以使用recursive CTE以下方法轻松完成:
WITH DataSource AS
(
SELECT DS1.*
FROM @Data DS1
INNER JOIN @Data DS2
ON DS1.[T_Id] = DS2.[T_Id]
AND DS1.[N_Id] = DS2.[N_Id]
AND DS1.[Id] = DS2.[Id] + 1
AND DS1.[Fg] = 2
AND DS2.[Fg] = 1
UNION ALL
SELECT DS1.*
FROM @Data DS1
INNER JOIN DataSource DS2
ON DS1.[T_Id] = DS2.[T_Id]
AND DS1.[N_Id] = DS2.[N_Id]
AND DS1.[Id] = DS2.[Id] - 1
AND DS1.[Fg] = 1
)
SELECT *
FROM DataSource
ORDER BY Id
Run Code Online (Sandbox Code Playgroud)
这个想法很简单.查询的第一部分获取所有valid记录fg = 2- 有效意味着在此之前有fg = 1来自同一组的记录.
然后在递归部分中,我们得到的所有记录都小于初始记录fg = 1.