我有一些这样的数字表(状态为免费或已分配)
id_set号状态 ----------------------- 1 000001已分配 1 000002免费 1 000003已分配 1 000004免费 1 000005免费 1 000006已分配 1 000007已分配 1 000008免费 1 000009免费 1 000010免费 1 000011已分配 1 000012分配 1 000013已分配 1 000014免费 1 000015已分配
并且我需要找到“ n”个连续数字,因此对于n = 3,查询将返回
1 000008免费 1 000009免费 1 000010免费
它应仅返回每个id_set的第一个可能的组(实际上,每个查询仅对id_set执行一次)
我正在检查WINDOW函数,尝试了诸如之类的查询COUNT(id_number) OVER (PARTITION BY id_set ROWS UNBOUNDED PRECEDING)
,但这就是我得到的全部:)我想不出逻辑,在Postgres中该怎么做。
我在考虑使用WINDOW函数创建虚拟列,该虚拟列为status ='FREE'的每个数字计算前面的行,然后选择第一个数字,其中count等于我的“ n”数字。
或按状态分组,但只能从一个已分配到另一个已分配,并仅选择至少包含“ n”个数字的组
编辑
我找到了这个查询(并做了一点修改)
WITH q AS
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY id_set, status ORDER BY number) AS rnd,
ROW_NUMBER() OVER (PARTITION BY id_set ORDER BY number) AS rn
FROM numbers
)
SELECT id_set,
MIN(number) AS first_number,
MAX(number) AS last_number,
status,
COUNT(number) AS numbers_count
FROM q
GROUP BY id_set,
rnd - rn,
status
ORDER BY
first_number
它会产生一组免费/已分配的号码,但我想只从满足条件的第一组中获得所有号码