优化平均数 SQL 查询
Optimize Average of Averages SQL Query
我有一个 table,其中每一行都是在某个日期进行销售的供应商。
我正在尝试计算 2019 年每个供应商的平均每日销售额,并获得一个数字。我认为这意味着我想计算平均值的平均值。
这是我正在考虑的查询,但在这么大的 table 上需要很长时间。没有这么多嵌套,有没有更聪明的方法来计算这个平均值?我感觉我扫描行的次数超出了我的需要。
-- 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 中的 运行。
我想你可以一次性完成计算:
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
更慢,因此您需要对此进行测试。
我有一个 table,其中每一行都是在某个日期进行销售的供应商。
我正在尝试计算 2019 年每个供应商的平均每日销售额,并获得一个数字。我认为这意味着我想计算平均值的平均值。
这是我正在考虑的查询,但在这么大的 table 上需要很长时间。没有这么多嵌套,有没有更聪明的方法来计算这个平均值?我感觉我扫描行的次数超出了我的需要。
-- 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 中的 运行。
我想你可以一次性完成计算:
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
更慢,因此您需要对此进行测试。