Đ "chọn trong một lựa chọn" thường được gọi là "chọn con" hoặc "truy vấn con" Trong trường hợp cụ thể của bạn, đó là truy vấn con có tương quan . LATERAL
tham gia (mới trong postgres 9.3) phần lớn có thể thay thế các truy vấn con tương quan bằng các giải pháp linh hoạt hơn:
Tôi không nghĩ bạn cần cả ở đây.
Đối với trường hợp đầu tiên của bạn tuy nhiên, truy vấn này có lẽ nhanh hơn và đơn giản hơn:
SELECT date, max(value) OVER (PARTITION BY grp) AS value
FROM (
SELECT *, count(value) OVER (ORDER BY date) AS grp
FROM test_fill_null
) sub;
count()
chỉ tính các giá trị không rỗng, vì vậy grp
được tăng lên với mọi giá trị value
, từ đó hình thành các nhóm như mong muốn. Thật tầm thường khi chọn một giá trị value
per grp
trong SELECT
bên ngoài .
Đối với trường hợp thứ hai của bạn , Tôi sẽ giả sử thứ tự ban đầu của các hàng được xác định bởi (id1, id2, tms)
như được chỉ ra bởi một trong các truy vấn của bạn.
SELECT id1, id2, tms
, count(step) OVER (ORDER BY id1, id2, tms) AS group_id
FROM (
SELECT *, CASE WHEN lag(tms, 1, '-infinity') OVER (PARTITION BY id1 ORDER BY id2, tms)
< tms - interval '5 min'
THEN true END AS step
FROM table0
) sub
ORDER BY id1, id2, tms;
Thích ứng với đơn đặt hàng thực tế của bạn. Một trong những điều này có thể bao gồm nó:
PARTITION BY id1 ORDER BY id2 -- ignore tms
PARTITION BY id1 ORDER BY tms -- ignore id2
SQL Fiddle với một ví dụ mở rộng.
Có liên quan: