id_set number status ----------------------- 1 000001 ASSIGNED 1 000002 FREE 1 000003 ASSIGNED 1 000004 FREE 1 000005 FREE 1 000006 ASSIGNED 1 000007 ASSIGNED 1 000008 FREE 1 000009 FREE 1 000010 FREE 1 000011 ASSIGNED 1 000012 ASSIGNED 1 000013 ASSIGNED 1 000014 FREE 1 000015 ASSIGNED
我需要找到连续的“n”个数字,例如当n = 3时,查询应返回:
1 000008 FREE 1 000009 FREE 1 000010 FREE
查询应仅返回每个id_set的第一个可能组(实际上,每次查询只会针对一个id_set执行)。
我在检查WINDOW函数,尝试了一些查询,例如 COUNT(id_number) OVER (PARTITION BY id_set ROWS UNBOUNDED PRECEDING),但这就是我得到的 :) 我想不出逻辑,如何在Postgres中实现。
我考虑使用WINDOW函数创建虚拟列,对每个状态为'FREE'的数字计算前面的行数,然后选择第一个计数等于我的“n”数字的数字。
或者也许按状态分组数字,但只从一个ASSIGNED到另一个ASSIGNED,并且只选择包含至少“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
它生成了一组免费/分配的数字,但我只想要满足条件的第一组中的所有数字。
id_set一个,还是只需要一个?如果这一开始就是问题的一部分,请更新你的问题。(这样其他人就可以看到完整的需求并提出建议或更新他们的答案。) - Andriy M