मैं केवल एक प्रश्न बनाऊंगा:
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
)
(कंपनी + मान) कॉलम पर एक समग्र अनुक्रमणिका इस क्वेरी की अधिकतम गति प्राप्त करने में मदद कर सकती है।
संपादित करें
उपरोक्त क्वेरी काम नहीं करती है
मैंने इसे थोड़ा ठीक किया है, यहां एक डेमो है:http://sqlfiddle.com/#!15/c9bfe/7
दो चीजें बदली गई हैं:
- कंपनी द्वारा विभाजन तारीख के अनुसार आदेश आईडी द्वारा ऑर्डर करें . के बजाय
- स्पष्ट रूप से सांख्यिक (क्योंकि पूर्णांक को 0 से छोटा कर दिया गया है):
ओवर (कंपनी द्वारा विभाजन)::संख्यात्मक
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
और अब डिलीट क्वेरी काम करेगी:
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
)