sql - 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
如果没有窗口功能,我怎么能做同样的事情?任何帮助将非常感激
解决方案
最简单的方法是使用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
推荐阅读
- scala - Scala 隐式函数
- postman - 使用 get 从另一台设备远程获取数据
- php - IIS 上托管的 Concrete5 的路由问题
- amazon-web-services - AWS CodePipeline - 代码部署到 S3 未压缩工件大小限制
- python - Tacotron 2 模型返回 Tensor 数组,需要将其转换为音频并使用 Flask 在前端网页中使用
- android - Android:片段不适合片段容器
- javascript - Javascript - 是否可以将参数传递给已经有参数的函数?
- flutter - Flutter 在具有相同 id 的 futurebuilder 项目中排除
- python - 使用 for 循环填充 lambda 函数时的行为不同
- asp.net - 无法使用 RSA-SHA512 算法通过 X509Certificate2 验证获取 httpRequest 签名参数