文章 查看内容

如何用窗口函数做去重求和?

如何用窗口函数做去重求和?

134 0 可视化分析 2024-10-24 10:31 发布者: 观小析

需求场景:相同维度值(门店、产品)下的数值(订单数)是一样的,想要维度下各个数值只计算一次求和。如果直接用sum,会按不同维度下的行数翻倍,如果用sum(distinct)只能是聚合度量,无法用partition by直接转为窗 ...

需求场景:相同维度值(门店、产品)下的数值(订单数)是一样的,想要维度下各个数值只计算一次求和。如果直接用sum,会按不同维度下的行数翻倍,如果用sum(distinct)只能是聚合度量,无法用partition by直接转为窗口函数。按截图中的示例,期望最后得到“3店”的值是250,“4店”的值是200。


实现方式(有三种)
第一种:类似于count(distinct)
思路:
数值字段需提前根据需要的维度聚合:[订单数]=sum([原始订单量])over(partition by [门店],[产品])

实现步骤:

1.获取到每个分组里的值[取值]=max([订单数])over(partition by [门店],[产品])

2.去重求和[个数]=size(collect_set([产品])over(partition by [门店]))

3.去重后求和[去重求和开窗]=sum([取值]/[个数])over(partition by [门店])

第二种:通过排序,仅取第一位

思路:先将需要去重的数据在分组内排序,再取每个分组排序为1的数值加和

实现步骤:

1.添加排序,[排序]=row_number()over(partition by [门店],[产品] order by 1)

排序函数可以参考《排序函数》

2.取排序序号=1的对应数值求和,[去重求和-取序号为1的数值求和]=sum(case when [排序]=1 then [订单数] else 0 end)over(partition by [门店])

第三种:使用sum(distinct) 仅限BI版本在6.0及以上,且Spark组件版本在3.4.1-hf10及以上(页面上无法直接查询到,可在对应专属售后群中咨询群主)

由于支持了Hive在新版本上逐步支持了distinct window functions,观远BI也随之更新Spark计算引擎支持distinct开窗方式。

实现步骤:[去重求和]=sum(distinct [订单数])over(partition by [门店])


路过

雷人

握手

鲜花

鸡蛋

评论

您需要登录后才可以发表言论 登录立即注册
微信服务号
联系我们
电话:400-880-0750
邮箱:hello@guandata.com
Copyright © 2001-2024 观远社区 版权所有 All Rights Reserved. 浙 ICP 备15006424号-3
去评论 去发文 返回顶部
返回顶部