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



此数据集包含一个有序的时间戳列(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窗口函数,然后使用带有条件聚合函数的SUM窗口函数。

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;

最新更新