Tôi chỉ tạo một truy vấn:
DELETE FROM mytable
WHERE company in (
SELECT Company
FROM (
SELECT Company,
COUNT(CASE WHEN value IS NULL THEN 1 END)
OVER (PARTITION BY company ORDER BY id
ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) As cnt,
COUNT(CASE WHEN value IS NULL THEN 1 END)
OVER (PARTITION BY company)
/
COUNT(*)
OVER (PARTITION BY company) As p50
) alias
WHERE cnt >= 3 OR p50 > 0.5
)
Chỉ mục tổng hợp trên các cột (công ty + giá trị) có thể giúp đạt được tốc độ tối đa của truy vấn này.
CHỈNH SỬA
Truy vấn trên không hoạt động
Tôi đã sửa nó một chút, đây là bản demo: http://sqlfiddle.com/#!15/c9bfe/7
Hai điều đã được thay đổi:
- PHẦN BỞI công ty ĐẶT HÀNG THEO ngày thay vì ĐẶT HÀNG THEO id
- truyền rõ ràng thành số (vì số nguyên đã bị cắt bớt thành 0):
HẾT (PHẦN CỦA CÔNG TY) ::số
SELECT company, cnt, p50
FROM (
SELECT company,
COUNT(CASE WHEN value IS NULL THEN 1 END)
OVER (PARTITION BY company ORDER BY date
ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) As cnt,
SUM(CASE WHEN value IS NULL THEN 1 ELSE 0 END)
OVER (PARTITION BY company)::numeric
/
COUNT(*)
OVER (PARTITION BY company) As p50
FROM mytable
) alias
-- WHERE cnt >= 3 OR p50 > 0.5
và bây giờ truy vấn xóa sẽ hoạt động:
DELETE FROM mytable
WHERE company in (
SELECT company
FROM (
SELECT company,
COUNT(CASE WHEN value IS NULL THEN 1 END)
OVER (PARTITION BY company ORDER BY date
ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) As cnt,
SUM(CASE WHEN value IS NULL THEN 1 ELSE 0 END)
OVER (PARTITION BY company)::numeric
/
COUNT(*)
OVER (PARTITION BY company) As p50
FROM mytable
) alias
WHERE cnt >= 3 OR p50 > 0.5
)