Postgresql 8.4 - 限制窗口函数范围



是否可以限制计算窗口函数的范围?

我正在使用PostgreSql 8.4。

示例查询:

select count(*) over() as TOTAL, id, .... from table limit 100

此查询返回 100 条排名靠前的记录,其第一列显示所有记录而不考虑限制。

问题是,有没有办法限制计数内的范围?,我的意思是,如果原始查询返回总共 5000,我只需要告诉"超过 1000"。

编辑:这个问题可以替换为,PostgreSql 是否有办法知道查询是否有超过 "n" 个结果?

这实际上是一个聪明的主意。如果您只对前 N 行感兴趣,为什么要一直计算?

对于大型结果集,我使用自定义框架定义运行了几个测试和窗口函数,速度更快

count(*) OVER (ROWS BETWEEN CURRENT ROW AND 1001 FOLLOWING) AS total_max_1001

问题是,您可能会为每一行获得不同的计数,这可能是也可能不是问题。如果您只考虑第一行,这就可以了。

无论哪种方式,对于大型结果集,(不相关的)子查询要快得多,但是:

SELECT id
     ,(SELECT count(*)::int
       FROM  (SELECT FROM tbl WHERE ... LIMIT  1001) x  -- repeat conditions
      ) AS total_max_1001
FROM   tbl
WHERE  ...
LIMIT  100;

测试在Postgres 9.1中。我希望自 8.4 以来的所有版本都有类似的结果,直到 9.3。

为您提供最多 1001 的精确完整计数(可能读作"超过 1000"),但不进一步计数。也适用于索引。我将用这个调整我自己的几个查询......

最新更新