【问题标题】:Postgresql 8.4 - Limiting window function rangePostgresql 8.4 - 限制窗口函数范围
【发布时间】:2014-05-15 19:09:01
【问题描述】:

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

我正在使用 PostgreSql 8.4。

一个示例查询:

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

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

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

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

【问题讨论】:

  • 您可以使用OVER (ROWS BETWEEN 1000 PRECEDING AND CURRENT ROW) 来做到这一点……但如果您想通过这样做来提高效率/提高性能,那将无济于事。您这样做是为了达到什么目的,您的目标是什么,您要解决的问题是什么?
  • 谢谢克雷格,我是这么认为的。我尝试做的是简单地告诉用户有超过 X 条记录,而他只看到 X 条记录。
  • 你真的只关心是否查询has more than "n" results吗?不是少的话有多少?
  • @ErwinBrandstetter,好问题。顺便说一句,我正在考虑删除计数并使用例如限制 101,如果检索到的记录超过 100 我会显示“有超过 100 条记录,请应用过滤器”,如果它们小于 100,只需显示“检索到 X 条记录”。
  • @leonardorame:嗯,这是 Craig 错误的罕见情况之一 - 正如我的回答中所详述的那样。

标签: sql postgresql count postgresql-8.4 window-functions


【解决方案1】:

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

我进行了几次测试,window functions with a custom frame definition 对于大型结果集更快

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

问题是,每行都有不同的计数,这可能是也可能不是问题。如果你只考虑 first 行,这很好用。

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

SELECT id
     ,(SELECT count(*)::int
       FROM  (SELECT 1 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”),但不再计数。也适用于索引。我将用这个来调整我自己的几个查询...

【讨论】:

  • 我将此标记为正确答案,因为它解决了我原来的问题,虽然我可能不会使用它,因为我认为它并没有显着提高性能,我必须测试这两种情况。
  • @leonardorame:我知道它可以提高性能,因为我在发布之前进行了广泛的测试,它对我有用。这取决于许多因素,尤其是索引和您的实际WHERE 条件。但我在各种情况下都看到了巨大的改进。
  • 嗯,干得好。我对这个结果感到非常惊讶。
猜你喜欢
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 2018-12-08
  • 2016-05-19
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
相关资源
最近更新 更多