为间隙和孤岛问题的变体提供 ID

Give IDs to variation on gaps and islands problem

此数据集包含一个有序的时间戳列 (A) 以及一对标记列 (B + C),它们表示 '',我要生成的是 (D).

我很难向同事解释这个问题,但本质上我需要一种方法来为这些行数不同的块提供 ID 但请注意,以第 8 行为例块有时只能占一行。

|           A         |  B  |  C  |  D  |
-----------------------------------------
| 06/10/2018 13:17:40 |  1  |  0  |  1  |
| 06/10/2018 13:17:56 |  0  |  0  |  1  |
| 06/10/2018 13:18:08 |  0  |  1  |  1  |
| 06/10/2018 13:18:21 |  1  |  0  |  2  |
| 06/10/2018 13:18:26 |  0  |  0  |  2  |
| 06/10/2018 13:18:26 |  0  |  0  |  2  |
| 06/10/2018 13:18:28 |  0  |  1  |  2  |
| 06/10/2018 13:18:28 |  1  |  1  |  3  |
| 06/10/2018 13:18:31 |  1  |  0  |  4  |
| 06/10/2018 19:49:26 |  0  |  0  |  4  |
| 06/10/2018 19:50:24 |  0  |  1  |  4  |

您可以尝试在子查询中使用 LAG window 函数,然后使用 SUM window 函数和条件聚合函数。

SELECT A,B,C,SUM(CASE WHEN preC = 1 THEN 1 ELSE 0 END) OVER(ORDER BY A,preC) +1  'D'
FROM (
 SELECT *,
        LAG(C,1,C) OVER(ORDER BY A) preC
 FROM T 
) t1

sqlfiddle

结果

|           A         |  B  |  C  |  D  |
-----------------------------------------
| 06/10/2018 13:17:40 |  1  |  0  |  1  |
| 06/10/2018 13:17:56 |  0  |  0  |  1  |
| 06/10/2018 13:18:08 |  0  |  1  |  1  |
| 06/10/2018 13:18:21 |  1  |  0  |  2  |
| 06/10/2018 13:18:26 |  0  |  0  |  2  |
| 06/10/2018 13:18:26 |  0  |  0  |  2  |
| 06/10/2018 13:18:28 |  0  |  1  |  2  |
| 06/10/2018 13:18:28 |  1  |  1  |  3  |
| 06/10/2018 13:18:31 |  1  |  0  |  4  |
| 06/10/2018 19:49:26 |  0  |  0  |  4  |
| 06/10/2018 19:50:24 |  0  |  1  |  4  |

我不明白 C 与这个问题有什么关系。这只是 B:

的累计和
select a, b, c,
       sum(b) over (order by a) as d
from t;