如何从具有重复项的 GROUP BY 中求和不同的值

Posted

技术标签:

【中文标题】如何从具有重复项的 GROUP BY 中求和不同的值【英文标题】:How to SUM distinct out of of GROUP BY that have duplicates 【发布时间】:2021-06-02 19:05:43 【问题描述】:

我正在计算四组内每人的平均订单数,我有以下SQL

SELECT      TO_DATE(ORDER_TIME AT TIME ZONE 'UTC' AT TIME ZONE 'US/Pacific','YYYY-MM-DD'),
            GROUP_P,
            COUNT(CASE WHEN ORDER_TIME IS NOT null
                       THEN ORDER_ID END) AS Numerator,
            COUNT(DISTINCT
                  CASE WHEN ORDER_TIME IS NOT null
                       THEN PERSON_ID END) AS Denominator
FROM        ORDER_TAB 
WHERE       TO_DATE(ORDER_TIME AT TIME ZONE 'UTC' AT TIME ZONE 'US/Pacific','YYYY-MM-DD')
BETWEEN     DATEADD( day, -1, current_Date) AND current_Date
GROUP BY    1, 2

我的结果是这样的

to_date     group_p    numerator   denominator
2021-06-01  A          28          20
2021-06-01  B          5           5
2021-06-01  C          1577        1025
2021-06-01  D          1010        765

因为一个person_id 可以在不同的组中,如果我从上表中总结,由于潜在的重复,我不会有准确的分母值。在我下面的代码中,我删除了group bynumerator 总结起来是一样的,但是denominator 越来越少了。

SELECT      TO_DATE(ORDER_TIME AT TIME ZONE 'UTC' AT TIME ZONE 'US/Pacific','YYYY-MM-DD'),

            COUNT(CASE WHEN ORDER_TIME IS NOT null
                       THEN ORDER_ID END) AS Numerator,
            COUNT(DISTINCT
                  CASE WHEN ORDER_TIME IS NOT null
                       THEN PERSON_ID END) AS Denominator
FROM        ORDER_TAB 
WHERE       TO_DATE(ORDER_TIME AT TIME ZONE 'UTC' AT TIME ZONE 'US/Pacific','YYYY-MM-DD')
BETWEEN     DATEADD( day, -1, current_Date) AND current_Date
GROUP BY    1
to_date     numerator   denominator
2021-06-01  2620        1699

由于我们的报告要求,我必须按照group_p 列显示的方式保留输出。

从输出中总结时使用准确的1699 的最佳方法是什么?

【问题讨论】:

请提供样本数据、所需结果、对所需逻辑的清晰解释以及适当的数据库标签。 如果一个人出现在一个多组中,他/她应该计入哪个组?第一次输出的分子值是否正确? 【参考方案1】:

下面的查询将对分母列的 person_id 计数一次(按升序排列的第一组)。为此,我使用了带有公用表表达式的 row_number() 窗口排名函数。

with cte as
(
    SELECT      GROUP_P,
                ORDER_TIME,
                row_number()over(partition by person_id order by group_p) rnk            
    FROM        ORDER_TAB 
    WHERE       TO_DATE(ORDER_TIME AT TIME ZONE 'UTC' AT TIME ZONE 'US/Pacific','YYYY-MM-DD')
    BETWEEN     DATEADD( day, -1, current_Date) AND current_Date
)
select    TO_DATE(ORDER_TIME AT TIME ZONE 'UTC' AT TIME ZONE 'US/Pacific','YYYY-MM-DD'),
          GROUP_P,
          COUNT(CASE WHEN ORDER_TIME IS NOT null
                     THEN ORDER_ID END) AS Numerator,
          COUNT(CASE WHEN ORDER_TIME IS NOT null and rnk=1
                     THEN PERSON_ID END) AS Denominator
from cte

【讨论】:

以上是关于如何从具有重复项的 GROUP BY 中求和不同的值的主要内容,如果未能解决你的问题,请参考以下文章

无法将具有相同 item_hsn 的字段分组并使用 group by sql 语句对其数量求和

如何在mongodb的单个查询中添加具有不同条件输出的Multiple Group By?

如何连接具有不同 GROUP BY 级别的两个查询,使一些记录为空

用 GROUP BY 求和

结合 GROUP BY 对数组求和

包含重复项的嵌套字典中的求和值