【问题标题】:Label groups in SQL records based on consecutive matching records根据连续匹配记录标记 SQL 记录中的组
【发布时间】:2020-06-18 17:44:27
【问题描述】:

给定以下数据集

CREATE TABLE #temp
 ( A NUMERIC,
   B NUMERIC )

INSERT INTO #temp VALUES (243184, 0);
INSERT INTO #temp VALUES (240719, 0);
INSERT INTO #temp VALUES (236482, 1);
INSERT INTO #temp VALUES (230777, 0);
INSERT INTO #temp VALUES (226023, 0);
INSERT INTO #temp VALUES (222522, 0);
INSERT INTO #temp VALUES (214977, 1);

SELECT *
  FROM #temp
 ORDER BY A DESC

A                                       B
--------------------------------------- ---------------------------------------
243184                                  0
240719                                  0
236482                                  1
230777                                  0
226023                                  0
222522                                  0
214977                                  1

如何获得以下输出?

A                                       B                                       C
--------------------------------------- --------------------------------------- ----
243184                                  0                                       1
240719                                  0                                       1
236482                                  1                                       2
230777                                  0                                       3
226023                                  0                                       3
222522                                  0                                       3
214977                                  1                                       4

当按降序排序时,我想根据“A”的值将 [B] 记录的连续实例分组。

所以每次 [B] 从 0 翻转到 1 时,都会开始一个新组

有什么想法吗?

【问题讨论】:

  • 我看不到预期输出的意义,你能解释一下吗?
  • 试过改变问题现在更有意义了吗?

标签: tsql sql-server-2014


【解决方案1】:

请试试这个:

SELECT s.A, s.B
    ,SUM(s.IsChange) OVER (ORDER BY s.A DESC ROWS UNBOUNDED PRECEDING) +1 AS [C]
FROM (
    SELECT t.A,t.B
        ,CASE WHEN t.B <> LEAD(t.B)OVER(ORDER BY t.A) THEN 1 ELSE 0 END AS [IsChange]
    FROM #temp t
) s
ORDER BY s.A DESC
;

【讨论】:

  • 这确实创建了所需的结果集,您能否解释其逻辑及其工作原理?
  • 在子查询中,它将当前 B 与下一个 B 进行比较,如果它发生更改,则将 IsChange 存储为 1。然后将该值 (1) 与所有先前的值相加,从而创建一个“组”值。
  • 英语是我的第二语言,SQL 是我的第一语言 :)
猜你喜欢
  • 2017-08-17
  • 1970-01-01
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
相关资源
最近更新 更多