是否可以限制计算窗口函数的范围?
我正在使用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"),但不进一步计数。也适用于索引。我将用这个调整我自己的几个查询......