如何从具有重复项的 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 by
,numerator
总结起来是一样的,但是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?