【发布时间】:2015-10-02 11:43:41
【问题描述】:
在 PostgreSQL 9.4 中,窗口函数具有 FILTER 的新选项,用于选择窗口框架的子集进行处理。文档中提到了它,但没有提供示例。在线搜索会产生一些示例,包括来自 2ndQuadrant 的示例,但我发现的所有示例都是带有常量表达式的相当琐碎的示例。我正在寻找的是一个包含当前行值的过滤器表达式。
假设我有一个包含一堆列的表,其中一个是date 类型:
col1 | col2 | dt ---------------------- 1 |一个 | 2015-07-01 2 |乙 | 2015-07-03 3 | c | 2015-07-10 4 | d | 2015-07-11 5 |电子| 2015-07-11 6 | f | 2015-07-13 ...
在整个表上处理date 的窗口定义很简单:WINDOW win AS (ORDER BY dt)
我有兴趣知道当前行之前的 4 天(含)有多少行。所以我想生成这个输出:
col1 | col2 | dt |数数 -------------------------------- 1 |一个 | 2015-07-01 | 1 2 |乙 | 2015-07-03 | 2 3 | c | 2015-07-10 | 1 4 | d | 2015-07-11 | 3 5 |电子| 2015-07-11 | 3 6 | f | 2015-07-13 | 4 ...
窗口函数的FILTER 子句似乎是显而易见的选择:
count(*) FILTER (WHERE <b>current_row.dt</b> - dt <= 4) OVER win
但是我如何指定current_row.dt(因为缺少更好的语法)?这甚至可能吗?
如果这是不可能的,还有其他方法可以在窗口框架中选择date 范围吗?框架规范无济于事,因为它都是基于行的。
我对使用子查询的替代解决方案不感兴趣,它必须基于窗口处理。
【问题讨论】:
-
有趣的问题。作为 Postgres 常客,您应该知道提供表定义(或者更好的是,提供完整的
CREATE TABLE脚本) -
@ErwinBrandstetter 这是否值得标记为“功能请求”?对我来说,能够根据当前行中存在的某些条件过滤窗口框架似乎很有价值。
-
是的,它对各种问题都有用,我在这里看到了几个相关的问题。由于实施中的主要变化,我担心该功能需要大量工作,但记录公众对该功能的兴趣并没有什么坏处。似乎与缺少的
RANGE BETWEEN ... PRECEDING/FOLLOWING功能有关,该功能已经是 documented in the ToDo Wiki
标签: sql postgresql window-functions postgresql-9.4