Sql 如何将有重复项的组外不同项相加
我正在计算四个组中每人的平均订单数,我有以下SQLSql 如何将有重复项的组外不同项相加,sql,database,reporting,data-warehouse,Sql,Database,Reporting,Data Warehouse,我正在计算四个组中每人的平均订单数,我有以下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,
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\u id
可以在不同的组中,如果我从上表总结,由于可能存在重复,我将无法获得准确的分母值。在我下面的代码中,我删除了分组by
,而分子
相加相同,但分母
越来越少
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
由于我们的报告要求,我必须以group\u p
列显示的方式保留输出
从输出中求和时,使用准确的
1699
的最佳方法是什么?下面的查询将为分母列计算一次人员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
请提供样本数据、所需结果、所需逻辑的清晰解释以及适当的数据库标记。如果一个人在一个多组中,那么他/她应该被计算在哪个组中?第一次输出时分子值正确吗?
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