根据列值添加序列组号

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 列,如果先前值为 1null,则该列将为 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