Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将有重复项的组外不同项相加_Sql_Database_Reporting_Data Warehouse - Fatal编程技术网

Sql 如何将有重复项的组外不同项相加

Sql 如何将有重复项的组外不同项相加,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,

我正在计算四个组中每人的平均订单数,我有以下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\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