Sql 如何计算雅典娜(普雷斯托)的总百分比?

Sql 如何计算雅典娜(普雷斯托)的总百分比?,sql,presto,amazon-athena,Sql,Presto,Amazon Athena,给定一个包含以下列的表: Date, Type 我正在运行以下SQL: SELECT Type, count(*) as CountPerType FROM myTable WHERE Date between 20200101 and 20200131 GROUP BY count(*) 我想要一个额外的列Percentage,它将有100.0*CountPerType/SUM(CountPerType)。在PrestoDB(Amazon Athena的动力)中,最有效的方法是什么?您可以

给定一个包含以下列的表:

Date, Type
我正在运行以下SQL:

SELECT Type, count(*) as CountPerType
FROM myTable
WHERE Date between 20200101 and 20200131
GROUP BY count(*)

我想要一个额外的列
Percentage
,它将有
100.0*CountPerType/SUM(CountPerType)
。在PrestoDB(Amazon Athena的动力)中,最有效的方法是什么?

您可以使用窗口功能来实现这一点。您应该始终对非聚合字段进行分组

select
    Type,
    CountPerType,
    100.0 * CountPerType/sum(CountPerType) over () as columnName
from
(
    SELECT 
        Type, 
        count(*) as CountPerType
    FROM myTable
    WHERE Date between 20200101 and 20200131
    GROUP BY 
        Type
) subq

我将编写没有子查询的查询。可以混合使用窗口函数和聚合函数:

SELECT Type,  COUNT(*) as CountPerType,
       COUNT(*) * 100.0 / SUM(COUNT(*)) OVER () as percentage
FROM t
WHERE Date BETWEEN 20200101 AND 20200131
GROUP BY Type;

我不知道性能是否与使用子查询的版本不同(这至少应该是一样好的)。但是查询肯定更简单。

我认为在窗口函数中,您需要整个表的总和,而不是按类型。这一个将返回100。查询在较小的数据集上运行良好,但在较大的数据集上结果有一定的误差。为了提供更多的上下文,在主要贡献行上它被关闭约1%。个人计数是正确的,但百分比数字是错误的。任何关于为什么会发生这种情况的想法。我的列值包含null。这会引起问题吗?我曾尝试将分区中的一个数字转换为双倍,但也没有效果。@AjayKrChoudhary。这应该正是您指定的计算。我不知道你为什么认为这是错误的。子查询不应改变结果。理论上我完全同意你的观点,但我得到的结果与概念中所述的不一样。
为什么你认为这是错误的
->,因为我将查询结果与excel中手动计算的百分比进行比较,两者的差异约为我所说的1-2%。这两个地方的单个计数(Excel与Athena查询结果)是相同的,但是,当计算百分比时,它是不同的。例如:假设我的总计数(分母)是1000,一行计数是50,那么期望的百分比是5%,然而,我得到的数字在~4.5%到6%之间。