0
SELECT CASE WHEN avg(count)>12 THEN 5
            WHEN avg(count)>8  THEN 4
            WHEN avg(count)>2  THEN 3
            WHEN avg(count)>1  THEN 2
            ELSE 1
            END,madeby
FROM (SELECT M.month,(SELECT count(*)
                     FROM Booking
                     WHERE date_trunc('month',starttime)=month
                         AND madeby=M.madeby
                     ) AS count,M.madeby
     FROM (SELECT date_trunc('month',generate_series(min(starttime),
                            current_timestamp,interval '1 month')::timestamp)
                            AS month,madeby
          FROM Booking
          GROUP BY madeby
     ) AS M
) AS BookingsPerMonth
GROUP BY madeby;

现在我需要在那里进行计算,我不质疑这一点。我猜问题是它计算了聚合函数 avg 四次。时间差异从使用 CASE 的 ~17 秒到没有的 ~4.5 秒(尽管我当时缺乏足够的信息)

有没有办法通过可变存储或其他方式来优化这一点,例如使时间接近 4.5 秒?

4

2 回答 2

2
SELECT  
    CASE 
        WHEN avg_count > 12 THEN 5
        WHEN avg_count > 8  THEN 4
        WHEN avg_count > 2  THEN 3
        WHEN avg_count > 1  THEN 2
        ELSE 1
    END,
    madeby
FROM (
    SELECT avg(count) as avg_count, madeby
    FROM (
        SELECT 
            M.month,
            (
                SELECT count(*)
                FROM Booking
                WHERE date_trunc('month',starttime)=month AND madeby=M.madeby
            ) AS count, 
            M.madeby
        FROM (
            SELECT 
                date_trunc('month',generate_series(min(starttime),
                current_timestamp,interval '1 month')::timestamp) AS month,
                madeby
            FROM Booking
            GROUP BY madeby
        ) AS M
    ) AS BookingsPerMonth
    GROUP BY madeby
) AS Averages;
于 2012-05-28T11:38:43.223 回答
0

我会尝试让 PG 只计算一次平均值,就像这样(在我脑海中):

而是做

SELECT CASE WHEN avg(count)>12 THEN 5
            WHEN avg(count)>8  THEN 4
...

SELECT CASE WHEN avgcount>12 THEN 5
            WHEN avgcount>8  THEN 4
...

然后替换

FROM (SELECT M.month,(SELECT count(*)
...
                     ) AS count,M.madeby

FROM (SELECT avg(M.month),(SELECT count(*)
...
                     ) AS avgcount,M.madeby

你的,S。

于 2012-05-28T12:06:24.183 回答