优化平均值 SQL 查询的平均值
Posted
技术标签:
【中文标题】优化平均值 SQL 查询的平均值【英文标题】:Optimize Average of Averages SQL Query 【发布时间】:2019-09-13 03:19:26 【问题描述】:我有一个表格,其中每一行都是在某个日期进行销售的供应商。
我正在尝试计算 2019 年每个供应商的平均每日销售额,并得到一个数字。我认为这意味着我想计算平均值。
这是我正在考虑的查询,但在这个大表上需要很长时间。没有这么多嵌套,有没有更聪明的方法来计算这个平均值?我感觉我扫描行的次数超出了我的需要。
-- Average of all vendor's average daily sale counts
SELECT AVG(vendor_avgs.avg_daily_sales) avg_of_avgs
FROM (
-- Get average number of daily sales for each vendor
SELECT vendor_daily_totals.memberdeviceid, AVG(vendor_daily_totals.cnt)
avg_daily_sales
FROM (
-- Get total number of sales for each vendor
SELECT vendorid, COUNT(*) cnt
FROM vendor_sales
WHERE year = 2019
GROUP BY vendorid, month, day
) vendor_daily_totals
GROUP BY vendor_daily_totals.vendorid
) vendor_avgs;
我很好奇是否有一种方法可以更有效地计算平均值。
顺便说一下,这是在 Impala 中运行的。
【问题讨论】:
【参考方案1】:我认为你可以一次性完成计算:
SELECT AVG(t.avgs)
FROM (
SELECT vendorid,
COUNT(*) * 1.0 / COUNT(DISTINCT month, day) as avgs
FROM vendor_sales
WHERE year = 2019
GROUP BY vendorid
) t
这会得到总数并除以天数。但是,COUNT(DISTINCT)
可能比 Impala 中嵌套的 GROUP BY
s 还要慢,因此您需要对此进行测试。
【讨论】:
将其标记为正确,因为它是我正在寻找的干净版本,尽管我在测试后意识到COUNT(DISTINCT)
确实比 Impala 中的嵌套 GROUP BY
s 慢很多。
添加了一个带有平均值的编辑,这是问题中所需要的。抱歉,如果不清楚。
在运行$ time impala -f nested_group_by.sql
时,我平均得到了 41 秒。运行$ time impala -f count_distinct.sql
时,我的平均时间为 746 秒。需要注意的重要一点:此 impala 数据集使用每日分区(在字段 year
、month
和 day
上)。
@Wassadamo 。 . . Postgres、Hive 和 Redshift 在COUNT(DISTINCT)
(性能方面)存在问题。我猜 Impala 也继承了这一点。以上是关于优化平均值 SQL 查询的平均值的主要内容,如果未能解决你的问题,请参考以下文章