小编sr3*_*r33的帖子

寻找更简单的递归查询替代方案

实际查询更多,但我面临的问题可以归结为:

用于过滤单调递增整数行集的查询,以便 -在最终结果集中, row(n+1).value >= row(n).value + 5

对于我需要解决的实际问题,行集计数在 1000 秒内。

举几个例子来澄清:

  • 如果行是: 1,2,3,4,5 :那么查询应该返回:1
  • 如果行是: 1,5,7,10,11,12,13 :那么查询应该返回:1,7,12
  • 如果行是:6,8,11,16,20,23:那么查询应该返回:6,11,16,23
  • 如果行是:6,8,12,16,20,23:那么查询应该返回:6,12,20

我设法通过以下查询获得了所需的结果,但它似乎过于复杂。取消注释不同的“..with t(k)..”以尝试它们。

我正在寻找任何简化或替代方法来获得相同的结果。

with recursive r(n, pri) as (
    with t(k) as (values (1),(2),(3),(4),(5))   -- the data we want to filter
    -- with t(k) as (values (1),(5),(7),(10),(11),(12),(13))
    -- with t(k) as (values (6),(8),(11),(16),(20),(23))
    -- with t(k) as (values (6),(8),(12),(16),(20),(23))
    select min(k), 1::bigint from t             -- bootstrap for recursive processing. 1 here represents rank().
    UNION
    select k, (rank() over(order …
Run Code Online (Sandbox Code Playgroud)

postgresql performance cte recursive postgresql-performance

7
推荐指数
1
解决办法
2098
查看次数