【问题标题】:Optimize Average of Averages SQL Query优化平均值 SQL 查询的平均值
【发布时间】: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 中运行的。

【问题讨论】:

    标签: sql hadoop query-optimization 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 BYs 还要慢,因此您需要对此进行测试。

    【讨论】:

    • 将其标记为正确,因为它是我正在寻找的干净版本,尽管我在测试后意识到 COUNT(DISTINCT) 确实比 Impala 中的嵌套 GROUP BYs 慢很多。
    • 添加了一个带有平均值的编辑,这是问题中所需要的。抱歉,如果不清楚。
    • 在运行$ time impala -f nested_group_by.sql 时,我平均得到了 41 秒。运行$ time impala -f count_distinct.sql 时,我的平均时间为 746 秒。需要注意的重要一点:此 impala 数据集使用每日分区(在字段 yearmonthday 上)。
    • @Wassadamo 。 . . Postgres、Hive 和 Redshift 在COUNT(DISTINCT)(性能方面)存在问题。我猜 Impala 也继承了这一点。
    猜你喜欢
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 2021-05-15
    • 1970-01-01
    • 2018-07-12
    • 2021-10-29
    • 1970-01-01
    相关资源
    最近更新 更多