根据组内连续两天将指标列添加到 table

Adding indicator column to table based on having two consecutive days within group

我需要添加一个逻辑来帮助我将连续两天中的第一天标记为 1,将第二天标记为 0,并按列分组(测试)。如果测试 (a) 连续三天,那么第三天应该再次从 1 开始,依此类推。

示例 table 如下所示,新列是我需要的列。

|---------------------|------------------|---------------------|
|      test           |     test_date    |      new col        |
|---------------------|------------------|---------------------|
|      a              |     1/1/2020     |      1              |
|---------------------|------------------|---------------------|
|      a              |     1/2/2020     |      0              |
|---------------------|------------------|---------------------|
|      a              |     1/3/2020     |      1              |
|---------------------|------------------|---------------------|
|      b              |     1/1/2020     |      1              |
|---------------------|------------------|---------------------|
|      b              |     1/2/2020     |      0              |
|---------------------|------------------|---------------------|
|      b              |     1/15/2020    |      1              |
|---------------------|------------------|---------------------|

因为这似乎是一些间隙和孤岛问题,我假设一些 windows 函数方法应该可以帮助我。

我尝试了类似下面的方法来获取连续部分,但在指标列上遇到了困难。

Select 
test, 
test_date,
grp_var = dateadd(day, 
                 -row_number() over (partition by test order by test_date), test_date)    
from 
my_table

这确实是一个缺口和孤岛问题。我建议使用 row_number() 和日期之间的差异来生成组,然后算术:

select
    test,
    test_date, 
    row_number() over(  
        partition by test, dateadd(day, -rn, test_date)
        order by test_date
    ) % 2 new_col
from (
    select 
        t.*, 
        row_number() over(partition by test order by test_date) rn
    from mytable t
) t

Demo on DB Fiddle:

test | test_date  | new_col
:--- | :--------- | ------:
a    | 2020-01-01 |       1
a    | 2020-01-02 |       0
a    | 2020-01-03 |       1
b    | 2020-01-01 |       1
b    | 2020-01-02 |       0
b    | 2020-01-15 |       1