CountDistinct统计每日唯一资源后求和及计算周期均值的方法咨询
解决方案
标准SQL实现
核心逻辑是先按日期维度分组计算每日唯一资源数,再对结果集做二次聚合,避免直接聚合产生全局去重的问题。
示例代码如下(适配MySQL、PostgreSQL、Spark SQL等绝大多数SQL引擎):
-- 计算指定时间段内每日唯一资源数的总和 SELECT SUM(daily_distinct_cnt) AS total_daily_resource_cnt FROM ( -- 内层子查询:按天统计当日使用的唯一资源数 SELECT DATE(stat_date) AS stat_date, -- 若日期带时分秒需先截断到天 COUNT(DISTINCT resource_id) AS daily_distinct_cnt FROM 你的表名 WHERE stat_date BETWEEN '202X-XX-XX' AND '202X-XX-XX' -- 替换为实际时间范围 GROUP BY DATE(stat_date) ) daily_stat; -- 若需计算日均唯一资源数,将外层SUM替换为AVG即可 SELECT AVG(daily_distinct_cnt) AS avg_daily_resource_cnt FROM ( SELECT DATE(stat_date) AS stat_date, COUNT(DISTINCT resource_id) AS daily_distinct_cnt FROM 你的表名 WHERE stat_date BETWEEN '202X-XX-XX' AND '202X-XX-XX' GROUP BY DATE(stat_date) ) daily_stat;
对应你给出的两日示例,内层子查询会先返回每日统计结果:第1天1个、第2天2个,外层求和后得到3,和预期结果完全匹配。
BI工具实现(适用于Tableau、Power BI等可视化分析场景)
如果是通过BI工具做分析无需手写SQL,可以用详细级别表达式实现:
- Tableau:创建计算字段,使用FIXED级别的LOD表达式:
{FIXED [统计日期]: COUNTD([资源ID])},将该字段拖入视图后选择聚合方式为「求和」即可 - Power BI:创建度量值,使用SUMX迭代函数实现:
每日去重资源总和 = SUMX( VALUES('业务表'[统计日期]), CALCULATE(DISTINCTCOUNT('业务表'[资源ID])) )
你描述的82+92+100+90+91+92的每日结果求和场景,用上述两种方案均可直接实现。


内容的提问来源于stack exchange,提问作者J_J
相关产品推荐
相关产品推荐

