【问题标题】:Spark sql distinct count over window function [duplicate]Spark sql对窗口函数的不同计数[重复]
【发布时间】:2021-06-26 13:59:39
【问题描述】:

假设我有以下数据

 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

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

【问题讨论】:

标签: sql pyspark apache-spark-sql


【解决方案1】:

最简单的方法是使用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

【讨论】:

    猜你喜欢
    • 2018-01-06
    • 1970-01-01
    • 2017-04-30
    • 2017-07-15
    • 2020-02-09
    • 2016-10-23
    • 1970-01-01
    相关资源
    最近更新 更多