【发布时间】:2021-08-04 02:49:13
【问题描述】:
我想获得过去 7 天和过去 14 天的平均评分。
我尝试使用 WITH AS 获取数据,但加载时间过长。还有其他更好的方法可以减少运行时间吗?
语法:
WITH last_7_days AS (
SELECT item, rating
FROM sales
WHERE (
rating IS NOT NULL
AND (entry_date >= CAST((CAST(now() AS timestamp) + (INTERVAL '-7 day')) AS date) AND entry_date < CAST((CAST(now() AS timestamp) + (INTERVAL '1 day')) AS date))
)
),
last_14_days AS (
SELECT item, rating
FROM sales
WHERE (
rating IS NOT NULL
AND (entry_date >= CAST((CAST(now() AS timestamp) + (INTERVAL '-14 day')) AS date) AND entry_date < CAST((CAST(now() AS timestamp) + (INTERVAL '1 day')) AS date))
)
)
SELECT last_7_days.item, avg(last_7_days.score) as "avg_last_7_days", avg(last_14_days.rating) as "avg_last_14_days", count(*) AS "count"
FROM last_7_days, last_14_days
WHERE last_7_days.item = last_14_days.item
GROUP BY last_7_days.item
ORDER BY "avg_last_7_days" DESC, last_7_days.item ASC
结果应该是这样的:
item|avg_last_7_days|avg_last_14_days|count|
谢谢
【问题讨论】:
-
对 WHERE 语句进行强制转换非常低效。我会尽量避免所有这些强制转换,并事先在查询之上设置变量。你尝试过这样的事情吗?
标签: sql postgresql join