按顺序设置分组值

Set value for group by order

我有 SQL table 列 COL_1、COL_2:

COL_1 COL_2 COL_3
a 2021-09-11 14:25:15.699 1
b 2021-09-11 14:25:36.489 2
a 2021-09-11 14:33:36.500 3
a 2021-09-11 14:36:24.915 3
a 2021-09-11 14:36:38.900 3
a 2021-09-11 14:36:54.905 3
c 2021-09-11 14:37:09.092 4
a 2021-09-11 14:39:09.111 5
d 2021-09-11 14:39:30.292 6

我需要COL_3。我通过对第 1 列进行分组并按日期(第 2 列)排序得到第 4 列,如果组发生变化,我会为以下组分配一个新索引。

这是一个经典的gaps-and-islands问题。

有很多解决方案。一个常见的方法是使用 LAG 来识别更改值的行,然后使用条件窗口 COUNT 来分配组号

WITH PrevValues AS (
    SELECT *,
      LAG(COL_1) OVER (ORDER BY COL_2) AS PrevCol1
    FROM YourTable t
)
SELECT COL_1,COL_2,COL_3,
  COUNT(CASE WHEN PrevCol1 = COL_1 THEN NULL ELSE 1 END)
      OVER (ORDER BY COL_2 ROWS UNBOUNDED PRECEDING) AS New_Col_3
FROM PrevValues t

db<>fiddle