【发布时间】:2016-04-07 23:06:29
【问题描述】:
实际查询更多,但我面临的问题可以提炼为:
过滤单调递增整数行集的查询,以便 - 在最终结果集中,row(n+1).value >= row(n).value + 5 .
对于我需要解决的实际问题,行集计数在1000s。
举几个例子来说明:
- 如果行是: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 by k)) rr -- rank() is required just to filter out the rows we dont want from the final result set, and no other reason
from r, t
where t.k >= r.n+5 and r.pri = 1 -- capture the rows we want, AND unfortunately a bunch of rows we dont want
)
select n from r where pri = 1; -- filter out the rows we dont want
【问题讨论】:
-
你不是说:
row(n-2) <= row(n) -5吗?例如:为什么输出中第二个示例中的7。因为1在第一个位置? -
好的,我明白了;间隙条件基于 result 集。
标签: postgresql common-table-expression recursive-query