Truy vấn thực tế có liên quan nhiều hơn, nhưng vấn đề tôi gặp phải có thể được giải quyết cho vấn đề này:
Một truy vấn để lọc một hàng các số nguyên tăng đơn điệu sao cho - trong tập kết quả cuối cùng, hàng (n + 1) .value> = row (n) .value + 5 .
Đối với vấn đề thực tế tôi cần giải quyết, số lượng hàng là trong 1000 giây.
Một vài ví dụ để làm rõ:
- nếu các hàng là: 1,2,3,4,5: thì truy vấn sẽ trả về: 1
- nếu các hàng là: 1,5,7,10,11,12,13: thì truy vấn sẽ trả về: 1,7,12
- nếu các hàng là: 6,8,11,16,20,23: thì truy vấn sẽ trả về: 6,11,16,23
- nếu các hàng là: 6,8,12,16,20,23: thì truy vấn sẽ trả về: 6,12,20
Tôi đã quản lý để có được kết quả cần thiết với truy vấn sau, nhưng có vẻ quá phức tạp. Bỏ ghi chú ".. với t (k) .." khác nhau để thử chúng.
Tôi đang tìm kiếm bất kỳ đơn giản hóa hoặc phương pháp thay thế nào để có được kết quả tương tự.
with recursive r(n, pri) as (
with t(k) as (values (1),(2),(3),(4),(5)) -- the data we want to filter
-- with t(k) as (values (1),(5),(7),(10),(11),(12),(13))
-- with t(k) as (values (6),(8),(11),(16),(20),(23))
-- with t(k) as (values (6),(8),(12),(16),(20),(23))
select min(k), 1::bigint from t -- bootstrap for recursive processing. 1 here represents rank().
UNION
select k, (rank() over(order by k)) rr -- rank() is required just to filter out the rows we dont want from the final result set, and no other reason
from r, t
where t.k >= r.n+5 and r.pri = 1 -- capture the rows we want, AND unfortunately a bunch of rows we dont want
)
select n from r where pri = 1;
row(n+1).value >= row(n).value + 5
và các hàng1,5,7,10,11,12,13
bạn nói nó sẽ trả về1,7,12
nhưng điều đó không đồng ý với quy tắc. Quy tắc cũng nên nói rằng bạn luôn trả về hàng đầu tiên. Vì vậy, sau đó bắt đầu với hàng 1 đầu tiên,5 >= 1 + 5
là sai nên 5 bị loại trừ. Sau đó7 >= 5 + 5
cũng là sai vì vậy 7 nên được loại trừ theo quy tắc, nhưng nó được bao gồm. Quy tắc của bạn giống như "bắt đầu với hàng đầu tiên, tìm hàng tiếp theo ít nhất năm lần so với giá trị hiện tại, lặp lại"