Mam tabelę z takimi liczbami (status jest BEZPŁATNY lub PRZYPISANY)
status numeru id_set ----------------------- 1 000001 PRZYPISANY 1 000002 ZA DARMO 1 000003 PRZYPISANE 1 000004 ZA DARMO 1 000005 ZA DARMO 1 000006 PRZYPISANY 1 000007 PRZYPISANY 1 000008 ZA DARMO 1 000009 ZA DARMO 1 000010 ZA DARMO 1 000011 PRZYPISANY 1 000012 PRZYPISANY 1 000013 PRZYPISANY 1 000014 ZA DARMO 1 000015 PRZYPISANY
i muszę znaleźć „n” kolejne liczby, więc dla n = 3 zapytanie zwróci
1 000008 ZA DARMO 1 000009 ZA DARMO 1 000010 ZA DARMO
Powinien zwracać tylko pierwszą możliwą grupę każdego zestawu id_set (w rzeczywistości byłby wykonywany tylko dla zestawu id_set na zapytanie)
Sprawdzałem funkcje WINDOW, próbowałem zapytań COUNT(id_number) OVER (PARTITION BY id_set ROWS UNBOUNDED PRECEDING)
, ale to wszystko, co mam :) Nie mogłem wymyślić logiki, jak to zrobić w Postgresie.
Myślałem o stworzeniu wirtualnej kolumny za pomocą funkcji WINDOW, zliczającej poprzednie wiersze dla każdej liczby, gdzie status = „FREE”, a następnie wybierz pierwszą liczbę, gdzie liczba jest równa mojej „n”.
A może grupuj numery według statusu, ale tylko od jednego PRZYPISANEGO do innego PRZYPISANEGO i wybierz tylko grupy zawierające co najmniej „n” liczby
EDYTOWAĆ
Znalazłem to zapytanie (i trochę je zmieniłem)
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
który tworzy grupy DARMOWYCH / PRZYPISANYCH liczb, ale chciałbym mieć wszystkie liczby tylko z pierwszej grupy, która spełnia warunek