【问题标题】:TSQL Group by Column with Multiple ValuesTSQL 按具有多个值的列分组
【发布时间】:2017-11-03 11:40:38
【问题描述】:

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

我想选择 [Fg] 列 = 1 的所有记录,按 [Id] 顺序连续导致每个 [T_Id][N_Id] 组合的值 2。

在某些情况下,[Fg] = 2 之前的记录不 = 1

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

因此对于下面的示例,我想选择具有[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) 

【问题讨论】:

  • 所以,FG 0 的所有记录都必须被过滤?因为否则 0、1、2 将是连续记录的正确顺序,不是吗?既然 ID 7 和 8 都具有 FG 1,为什么 ID 7 被认为是正确的记录?
  • @Tyron78 你可以有多个连续记录,其中 FG = 1。我在问题中解释了这一点
  • 看看here;为什么使用 SQLServer 2008r2?

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


【解决方案1】:

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

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

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

【讨论】:

  • @gotqn 谢谢。我在CROSS APPLY 解决方案上搞砸了很长时间。
【解决方案2】:

您不能使用滞后/领先,因为它始于 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多