Böyle sayılarla bazı tablo var (durum ÜCRETSİZ veya Atandı)
id_set sayı durumu ----------------------- 1 000001 Atandı 1 000002 ÜCRETSİZ 1 000003 Atandı 1 000004 ÜCRETSİZ 1 000005 ÜCRETSİZ 1 000006 Atandı 1 000007 Atandı 1 000008 ÜCRETSİZ 1 000009 ÜCRETSİZ 1 000010 ÜCRETSİZ 1 000011 Atandı 1 000012 Atandı 1 000013 Atandı 1 000014 ÜCRETSİZ 1 000015 Atandı
ve "n" ardışık sayıları bulmam gerekiyor, bu yüzden n = 3 için sorgu dönecekti
1 000008 ÜCRETSİZ 1 000009 ÜCRETSİZ 1 000010 ÜCRETSİZ
Her id_set için yalnızca ilk olası grubu döndürmelidir (aslında, sorgu başına sadece id_set için yürütülür)
PENCERE işlevlerini kontrol ediyordum, bazı sorguları denedim COUNT(id_number) OVER (PARTITION BY id_set ROWS UNBOUNDED PRECEDING)
, ama hepsi bu kadar :) :) Mantık, Postgres'de bunu nasıl yapacağımı düşünemedim.
Status = 'FREE' her sayı için önceki satırları sayma WINDOW işlevlerini kullanarak sanal sütun oluşturma, sonra sayım benim "n" numarasına eşit nerede ilk sayı seçin düşünüyordum.
Veya sayıları duruma göre gruplayabilirsiniz, ancak yalnızca bir tanesi Atandı diğerine Atandı ve yalnızca en az "n" sayı içeren grupları seçin
DÜZENLE
Bu sorguyu buldum (ve biraz değiştirdim)
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 sayı grupları oluşturur, ancak koşulu karşılayan ilk gruptaki tüm sayılara sahip olmak istiyorum