首页 > 解决方案 > Spark sql对窗口函数的不同计数

问题描述

可以说我有以下数据

 id                         some_date    days      weeks     
 1111111111111111111111111  2021-03-01    2         1               
 1111111111111111111111111  2021-03-01    8         2                
 1111111111111111111111111  2021-03-01    9         2               
 1111111111111111111111111  2021-03-01    22        4               
 1111111111111111111111111  2021-03-01    24        4               

我想计算每一行的终生周总数。例如,上述数据的结果如下:

 id                         some_date    days      weeks     lifetime_weeks
 1111111111111111111111111  2021-03-01    2         1               1
 1111111111111111111111111  2021-03-01    8         2               2
 1111111111111111111111111  2021-03-01    9         2               2
 1111111111111111111111111  2021-03-01    22        4               3
 1111111111111111111111111  2021-03-01    24        4               3

我试图用窗口函数来实现它,但由于不允许有不同的内部窗口函数,我最终遇到了错误

COUNT(distinct id) OVER(PARTITION BY id order by days rows unbounded preceding) as lifetime_weeks

如果没有窗口功能,我怎么能做同样的事情?任何帮助将非常感激

标签: sqlpysparkapache-spark-sql

解决方案


最简单的方法是使用row_number()确定每周的第一次出现,然后使用累积和:

select t.*,
       sum(case when seqnum = 1 then 1 else 0 end) over (partition by id order by days) as num_unique_weeks
from (select t.*,
             row_number() over (partition by id, weeks order by days) as seqnum
      from t
     ) t

推荐阅读