根据组内连续两天将指标列添加到 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
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
我需要添加一个逻辑来帮助我将连续两天中的第一天标记为 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
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