Tôi có một số bảng có các số như thế này (trạng thái là MIỄN PHÍ hoặc được gán)
trạng thái số id_set ----------------------- 1 000001 đã ký 1 000002 MIỄN PHÍ 1 000003 Đã ký 1 000004 MIỄN PHÍ 1 000005 MIỄN PHÍ 1 000006 đã ký 1 000007 đã ký 1 000008 MIỄN PHÍ 1 000009 MIỄN PHÍ 1 000010 MIỄN PHÍ 1 000011 đã ký 1 000012 đã ký 1 000013 đã ký 1 000014 MIỄN PHÍ 1 000015 đã ký
và tôi cần tìm các số liên tiếp "n", vì vậy với n = 3, truy vấn sẽ trả về
1 000008 MIỄN PHÍ 1 000009 MIỄN PHÍ 1 000010 MIỄN PHÍ
Nó sẽ chỉ trả về nhóm có thể đầu tiên của mỗi id_set (trên thực tế, nó sẽ chỉ được thực thi cho id_set cho mỗi truy vấn)
Tôi đã kiểm tra các hàm WINDOW, đã thử một số truy vấn như thế COUNT(id_number) OVER (PARTITION BY id_set ROWS UNBOUNDED PRECEDING)
, nhưng đó là tất cả những gì tôi có :) Tôi không thể nghĩ về logic, làm thế nào để làm điều đó trong Postgres.
Tôi đã suy nghĩ về việc tạo cột ảo bằng cách sử dụng các hàm WINDOW đếm các hàng trước cho mỗi số trong đó status = 'MIỄN PHÍ', sau đó chọn số đầu tiên, trong đó số đếm bằng số "n" của tôi.
Hoặc có thể nhóm số theo trạng thái, nhưng chỉ từ một người được gán cho người khác được chỉ định và chỉ chọn các nhóm có ít nhất số "n"
BIÊN TẬP
Tôi tìm thấy truy vấn này (và thay đổi nó một chút)
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
nơi tạo ra các nhóm số MIỄN PHÍ / ĐƯỢC GỬI, nhưng tôi muốn có tất cả các số từ chỉ nhóm đầu tiên đáp ứng điều kiện