У меня есть таблица с такими номерами (статус БЕСПЛАТНЫЙ или НАЗНАЧЕН)
Идентификационный номер ----------------------- 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" числу.
Или, может быть, группировать номера по статусу, но только от одного 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
который производит группы номеров FREE / ASSIGNED, но я хотел бы, чтобы все номера были только из первой группы, которая удовлетворяет условию