【发布时间】:2013-12-11 17:34:26
【问题描述】:
当我开始处理这个问题时,我想,“这将是一个很好的学习窗口函数的查询。”我最终无法让它与窗口函数一起使用,但我能够使用连接获得我想要的。
您将如何调整此查询以使用窗口函数:
SELECT
day,
COUNT(i.project) as num_open
FROM generate_series(0, 364) as t(day)
LEFT JOIN issues i on (day BETWEEN i.closed_days_ago AND i.created_days_ago)
GROUP BY day
ORDER BY day;
上面的查询获取范围由 created_days_ago 和 closed_days ago 表示的问题列表,并且在过去 365 天内,它将计算该特定日期已创建但尚未关闭的问题数量。
http://sqlfiddle.com/#!15/663f6/2
issues 表如下所示:
CREATE TABLE issues (
id SERIAL,
project VARCHAR(255),
created_days_ago INTEGER,
closed_days_ago INTEGER);
我的想法是,给定日期的分区应该包括问题中的所有行,其中日期介于创建日期和关闭日期之间。类似SELECT day, COUNT(i.project) OVER (PARTITION day BETWEEN created_days_ago AND closed_days_ago) ...
我以前从未使用过窗口函数,所以我可能遗漏了一些基本的东西,但似乎这正是使窗口函数如此出色的查询类型。
【问题讨论】:
-
我认为窗口不会对此有用。您需要
generate_series来创建行集。窗口函数不能生成全新的行,因此您不能使用窗口函数为零问题的那些日子创建行,或者为没有打开或关闭问题的那些日子生成一行。 -
"created_days_ago 整数" -- 哎哟。您实际上运行了一个 cron 来每天增加这个值,而不是存储时间戳或日期? :-(
-
@Denis,它们实际上作为日期存储在实际表中,返回的是视图中计算的 days_ago 值。我只是为这个问题简化了一点。
-
+1 用于展示一个完整的案例(针对一个有趣的问题),包括一个工作小提琴。仅缺少您的 Postgres 版本。
标签: sql postgresql aggregate-functions window-functions cumulative-sum