具有多个值的列的TSQL组

时间:2017-11-03 11:40:38

标签: sql-server tsql sql-server-2008-r2

我在SQLServer 2008r2中有一个表,如下所示。

example dataset

我想选择[Fg]列= 1的所有记录,其中[Id]订单导致每个[T_Id][N_Id]组合连续导入值2。

有些情况可能会导致[Fg] = 2之前的记录没有&t = 1

[Fg] = 1的值可以有任意数量的记录,但每个[Fg][T_Id]组合的[N_Id] = 2只有一条记录。

因此,对于下面的示例,我想选择[Id] s(4,5)和(7,8,9)和(19,20)的记录。

排除[T_Id] 3和4的所有记录。

预期输出

Expected output

示例数据集

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) 

2 个答案:

答案 0 :(得分: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

enter image description here

这个想法很简单。查询的第一部分获取valid所有fg = 2条记录 - 有效表示此记录之前有来自同一组fg = 1的记录。

然后在递归部分,我们得到的所有记录都小于初始记录,其中fg = 1

答案 1 :(得分:0)

您无法使用滞后/潜在客户,因为它始于SQL 2012,您需要执行以下操作。

SELECT  fg - (
        SELECT  TOP 1 fg
        FROM    table m2
        WHERE   m2.fg = m1.fg-1 OR (m2.fg = m1.fg AND m2.id < m1.id)
        ORDER BY 
                fg, id
        )
FROM table m1
ORDER BY
      fg, id