具有多个值的列的TSQL组

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.

  • @gotqn感谢你.我用"CROSS APPLY"解决方案搞乱了很长时间. (2认同)