根据列值添加序列组号
Adding a sequence group number based on the column value
我有一个如下所示的面板数据:
ID TFvalue Date
1 0 2021-01-01
1 0 2021-02-01
1 1 2021-03-01
1 1 2021-04-01
2 0 2021-01-10
2 1 2021-02-10
2 0 2021-03-10
2 0 2021-04-10
3 1 2021-01-05
3 1 2021-02-05
3 0 2021-03-05
3 1 2021-04-05
我需要对每个 id 的行进行分组,直到 TFvalue
中的 1 出现。每次TFvalue
中的1出现,一个新的组,之后需要给出序号。比如我需要的是...
ID TFvalue Date GroupNum
1 0 2021-01-01 1
1 0 2021-02-01 1
1 1 2021-03-01 1
1 1 2021-04-01 2
2 0 2021-01-10 1
2 1 2021-02-10 1
2 0 2021-03-10 2
2 0 2021-04-10 2
3 1 2021-01-05 1
3 1 2021-02-05 2
3 0 2021-03-05 3
3 1 2021-04-05 3
我试过Dense_Rank()
,但没能得到我想要的。任何建议将不胜感激。
您可以检查 TFvalue
的先前值以获得 flag
列,如果先前值为 1
或 null
,则该列将为 1
, 或 0
如果先前的值为 0
.
然后使用 SUM()
window 函数得到列 GroupNum
:
SELECT ID, TFvalue, Date,
SUM(flag) OVER (PARTITION BY ID ORDER BY Date) GroupNum
FROM (
SELECT *, LAG(TFvalue, 1, 1) OVER (PARTITION BY ID ORDER BY Date) flag
FROM tablename
) t;
参见demo。
我有一个如下所示的面板数据:
ID TFvalue Date
1 0 2021-01-01
1 0 2021-02-01
1 1 2021-03-01
1 1 2021-04-01
2 0 2021-01-10
2 1 2021-02-10
2 0 2021-03-10
2 0 2021-04-10
3 1 2021-01-05
3 1 2021-02-05
3 0 2021-03-05
3 1 2021-04-05
我需要对每个 id 的行进行分组,直到 TFvalue
中的 1 出现。每次TFvalue
中的1出现,一个新的组,之后需要给出序号。比如我需要的是...
ID TFvalue Date GroupNum
1 0 2021-01-01 1
1 0 2021-02-01 1
1 1 2021-03-01 1
1 1 2021-04-01 2
2 0 2021-01-10 1
2 1 2021-02-10 1
2 0 2021-03-10 2
2 0 2021-04-10 2
3 1 2021-01-05 1
3 1 2021-02-05 2
3 0 2021-03-05 3
3 1 2021-04-05 3
我试过Dense_Rank()
,但没能得到我想要的。任何建议将不胜感激。
您可以检查 TFvalue
的先前值以获得 flag
列,如果先前值为 1
或 null
,则该列将为 1
, 或 0
如果先前的值为 0
.
然后使用 SUM()
window 函数得到列 GroupNum
:
SELECT ID, TFvalue, Date,
SUM(flag) OVER (PARTITION BY ID ORDER BY Date) GroupNum
FROM (
SELECT *, LAG(TFvalue, 1, 1) OVER (PARTITION BY ID ORDER BY Date) flag
FROM tablename
) t;
参见demo。