Saya memiliki beberapa tabel dengan angka seperti ini (statusnya GRATIS atau DITANDATANGANI)
status nomor id_set ----------------------- 1 000001 DITANDATANGANI 1 000002 GRATIS 1 000003 DITANDATANGANI 1 000004 GRATIS 1 000005 GRATIS 1 000006 DITANDATANGANI 1 000007 DITANDATANGANI 1 000008 GRATIS 1 000009 GRATIS 1 000010 GRATIS 1 000011 DITANDATANGANI 1 000012 DITANDATANGANI 1 000013 DITANDATANGANI 1 000014 GRATIS 1 000015 DITANDATANGANI
dan saya perlu menemukan angka berurutan "n", jadi untuk n = 3, kueri akan kembali
1 000008 GRATIS 1 000009 GRATIS 1 000010 GRATIS
Itu harus mengembalikan hanya kelompok pertama yang mungkin dari setiap id_set (pada kenyataannya, itu akan dieksekusi hanya untuk id_set per permintaan)
Saya sedang memeriksa fungsi WINDOW, mencoba beberapa pertanyaan seperti COUNT(id_number) OVER (PARTITION BY id_set ROWS UNBOUNDED PRECEDING)
, tapi hanya itu yang saya dapat :) Saya tidak bisa memikirkan logika, bagaimana melakukannya di Postgres.
Saya sedang berpikir tentang membuat kolom virtual menggunakan fungsi WINDOW menghitung baris sebelumnya untuk setiap nomor di mana status = 'GRATIS', lalu pilih angka pertama, di mana jumlah sama dengan nomor "n" saya.
Atau mungkin mengelompokkan nomor berdasarkan status, tetapi hanya dari satu yang DITANDATANGANI ke yang lain DITANDATANGANI dan pilih hanya grup yang mengandung setidaknya "n" angka
EDIT
Saya menemukan pertanyaan ini (dan mengubahnya sedikit)
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
yang menghasilkan grup angka GRATIS / TANDA TANGAN, tetapi saya ingin memiliki semua angka dari hanya grup pertama yang memenuhi persyaratan