मैं सोचता हूं आप यही खोज रहे हैं:
13 या नए को पोस्ट करें
WITH cte AS ( -- MATERIALIZED
SELECT app_id, min(review_date) AS earliest_review, count(*)::int AS total_ct
FROM reviews
GROUP BY 1
)
SELECT *
FROM (
SELECT generate_series(min(review_date)
, max(review_date)
, '1 day')::date
FROM reviews
) d(review_window_start)
LEFT JOIN LATERAL (
SELECT total_ct, array_agg(app_id) AS apps
FROM (
SELECT app_id, total_ct
FROM cte c
WHERE c.earliest_review >= d.review_window_start
ORDER BY total_ct DESC
FETCH FIRST 1 ROWS WITH TIES -- new & hot
) sub
GROUP BY 1
) a ON true;
WITH TIES
थोड़ा सस्ता बनाता है। Postgres 13 (वर्तमान में बीटा) में जोड़ा गया। देखें:
12 या पुराने को पोस्टग्रेट करें
WITH cte AS ( -- MATERIALIZED
SELECT app_id, min(review_date) AS earliest_review, count(*)::int AS total_ct
FROM reviews
GROUP BY 1
)
SELECT *
FROM (
SELECT generate_series(min(review_date)
, max(review_date)
, '1 day')::date
FROM reviews
) d(review_window_start)
LEFT JOIN LATERAL (
SELECT total_ct, array_agg(app_id) AS apps
FROM (
SELECT total_ct, app_id
, rank() OVER (ORDER BY total_ct DESC) AS rnk
FROM cte c
WHERE c.earliest_review >= d.review_window_start
) sub
WHERE rnk = 1
GROUP BY 1
) a ON true;
db<>fiddle यहां
ऊपर जैसा ही है, लेकिन बिना WITH TIES
।
हमें apps
तालिका को शामिल करने की आवश्यकता नहीं है बिल्कुल भी। तालिका reviews
हमारे पास आवश्यक सभी जानकारी है।
सीटीई cte
प्रति ऐप जल्द से जल्द समीक्षा और वर्तमान कुल गणना की गणना करता है। सीटीई बार-बार गणना से बचा जाता है। काफी मदद करनी चाहिए।
इसे हमेशा Postgres 12 से पहले अमल में लाया जाता है, और Postgres 12 में स्वचालित रूप से अमल में लाया जाना चाहिए क्योंकि यह मुख्य क्वेरी में कई बार उपयोग किया जाता है। नहीं तो आप कीवर्ड MATERIALIZED
जोड़ सकते हैं
Postgres 12 या बाद में इसे बाध्य करने के लिए। देखें:
अनुकूलित generate_series()
कॉल शुरुआती से लेकर नवीनतम समीक्षा तक दिनों की श्रृंखला तैयार करता है। देखें:
- जनरेटिंग टाइम PostgreSQL में दो तिथियों के बीच श्रृंखला
- पोस्टग्रेज में एक generate_series पर एक काउंट क्वेरी में शामिल हों और "0" के रूप में Null-values को पुनः प्राप्त करें
अंत में, LEFT JOIN LATERAL
आप पहले ही खोज चुके हैं। लेकिन चूंकि एकाधिक ऐप्स एक साथ जुड़ सकते हैं अधिकांश समीक्षाओं के लिए, सभी विजेताओं को पुनः प्राप्त करें, जो 0 - n ऐप्स हो सकते हैं। क्वेरी सभी दैनिक विजेताओं को एक सरणी में एकत्रित करती है, इसलिए हमें प्रति review_window_start
के लिए एक परिणाम पंक्ति मिलती है . वैकल्पिक रूप से, अधिक से अधिक एक . प्राप्त करने के लिए टाईब्रेकर को परिभाषित करें विजेता। देखें: