PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

दिनों की गतिशील श्रृंखला के बाद से उच्चतम समीक्षा संख्या वाले ऐप्स प्राप्त करें

मैं सोचता हूं आप यही खोज रहे हैं:

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() कॉल शुरुआती से लेकर नवीनतम समीक्षा तक दिनों की श्रृंखला तैयार करता है। देखें:

अंत में, LEFT JOIN LATERAL आप पहले ही खोज चुके हैं। लेकिन चूंकि एकाधिक ऐप्स एक साथ जुड़ सकते हैं अधिकांश समीक्षाओं के लिए, सभी विजेताओं को पुनः प्राप्त करें, जो 0 - n ऐप्स हो सकते हैं। क्वेरी सभी दैनिक विजेताओं को एक सरणी में एकत्रित करती है, इसलिए हमें प्रति review_window_start के लिए एक परिणाम पंक्ति मिलती है . वैकल्पिक रूप से, अधिक से अधिक एक . प्राप्त करने के लिए टाईब्रेकर को परिभाषित करें विजेता। देखें:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. बहु-क्लाउड वातावरण में PostgreSQL सुरक्षा का मानकीकरण

  2. मैं स्प्रिंगबूट और हाइबरनेट का उपयोग करके जेडीबीसी पैरामीटर कैसे पास करूं?

  3. एक जेसन फ़ील्ड में कैसे खोजें जिसमें वाक्पटु के साथ वस्तुओं की एक सरणी हो

  4. सभी डेटाबेस नाम प्रदर्शित करें

  5. बड़ी मात्रा में प्रश्नों के साथ नोड-पोस्टग्रेज