У мене є таблиця з такими номерами (статус або БЕЗКОШТОВНО, або ЗНАЧЕНО)
статус номера 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', а потім виберіть перше число, де кількість дорівнює моєму «n» номеру.
Або, можливо, номери груп за статусом, але лише від одного ПІДПРИЄМЛЕННЯ до іншого ЗНАЧЕННЯ та виберіть лише групи, що містять принаймні "n" числа
EDIT
Я знайшов цей запит (і трохи змінив його)
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
яка створює групи БЕЗКОШТОВНИХ / ВИЗНАЧЕНИХ номерів, але я хотів би, щоб усі номери були тільки з першої групи, яка відповідає умові