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

पुनरावर्ती क्वेरी में कुल कार्यों की अनुमति नहीं है। क्या इस प्रश्न को लिखने का कोई वैकल्पिक तरीका है?

यह सुंदर नहीं है, लेकिन मुझे इसका समाधान मिल गया है:

WITH RECURSIVE rankings(rankable_type, rankable_id, athlete, value, rank) AS (
  SELECT 'Sport', sport_id, athlete, seconds, RANK() over(PARTITION BY sport_id ORDER BY seconds)
  FROM lap_times lt

  UNION ALL

  SELECT 'Category', *, rank() OVER(PARTITION by category_id ORDER BY avg_rank) FROM (
    SELECT DISTINCT category_id, athlete, avg(r.rank) OVER (PARTITION by category_id, athlete) AS avg_rank
    FROM categories c
    JOIN memberships m ON m.category_id = c.id
    JOIN rankings r ON r.rankable_type = m.member_type AND r.rankable_id = m.member_id
  ) _
)
SELECT * FROM rankings;

क्वेरी के पुनरावर्ती भाग में, GROUP BY . को कॉल करने के बजाय और avg(r.rank) . की गणना करना , मैं एक ही कॉलम पर विभाजित विंडो फ़ंक्शन का उपयोग करता हूं। इसका औसत रैंक की गणना के समान प्रभाव पड़ता है।

एक नकारात्मक पहलू यह है कि यह गणना आवश्यकता से अधिक बार होती है। अगर हम GROUP BY फिर avg(r.rank) , जो कि avg(r.rank) . से अधिक कुशल होगा फिर GROUP BY

चूंकि नेस्टेड क्वेरी के परिणाम में अब डुप्लीकेट हैं, इसलिए मैं DISTINCT का उपयोग कर रहा हूं इन्हें फ़िल्टर करने के लिए और फिर बाहरी क्वेरी RANK() . की गणना करती है प्रत्येक category_id . के सभी एथलीटों में से इन औसतों के आधार पर।

मैं अभी भी यह जानने के लिए उत्सुक हूं कि क्या कोई ऐसा करने का बेहतर तरीका जानता है। धन्यवाद



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. कॉलम 'मैरी' मौजूद नहीं है

  2. PostgreSQL में EXCEPT कैसे काम करता है

  3. PostgreSQL:सभी विदेशी कुंजियों को कैसे अनुक्रमित करें?

  4. Postgres स्ट्रिंग सरणी पर केस-असंवेदनशील अनुक्रमणिका बनाना

  5. वर्तमान (चल रहे क्वेरी के क्षण में) अनुक्रम मान प्राप्त करने के विकल्प