मेरे पास नीचे एक बड़ा क्वेरी प्रोग्राम है;

WITH cte AS(
SELECT *
  FROM (
    SELECT project_name,
    SUM(reward_value) AS total_reward_value,
    DATE_TRUNC(date_signing, MONTH) as month,
    date_signing,
    Row_number() over (partition by DATE_TRUNC(date_signing, MONTH)
                                          order by SUM(reward_value) desc) AS rank
      FROM `deals`
    WHERE CAST(date_signing as DATE) > '2019-12-31' 
    AND CAST(date_signing as DATE) < '2020-02-01'
    AND target_category = 'achieved'
    AND project_name IS NOT NULL
    GROUP BY project_name, month, date_signing
  )
)

SELECT * FROM cte WHERE rank <= 5

जो निम्नलिखित परिणाम देता है:
1

जबकि मैं प्रत्येक महीने के भीतर प्रत्येक अनूठी परियोजना के एसयूएम होने की उम्मीद करता हूं और फिर मैं केवल शीर्ष 5 को फ़िल्टर करता हूं।

कुछ इस तरह:
2

मुझे निम्न त्रुटि मिली यदि date_signing समूह को हटा दिया गया है, तो अभिव्यक्ति संदर्भ कॉलम date_signing द्वारा विभाजन जो न तो समूहीकृत है और न ही [16:48] पर एकत्र किया गया है।

क्या सुधार किया जाना चाहिए किसी भी संकेत की सराहना की जाएगी!

0
Adnan Zahry 4 पद 2020, 20:54

2 जवाब

सबसे बढ़िया उत्तर

शायद एक और सबक्वायरी?

WITH cte AS(
  SELECT project_name,
    SUM(reward_value) as reward_sum,
    DATE_TRUNC(date_signing, MONTH) as month
  FROM `deals`
  WHERE CAST(date_signing as DATE) > '2019-12-31' 
    AND CAST(date_signing as DATE) < '2020-02-01'
    AND target_category = 'achieved'
    AND project_name IS NOT NULL
  GROUP BY project_name, month
),
ranks AS (
  SELECT 
    project_name,
    reward_sum,
    month,
    ROW_NUMBER() over (PARTITION BY month ORDER BY reward_sum DESC) AS rank
)
SELECT * 
FROM ranks 
WHERE rank <= 5
0
Sergey Geron 4 पद 2020, 21:45

हाँ, आप ऐसा नहीं कर सकते, आप इसके बजाय अंतिम हस्ताक्षर तिथि दिखा सकते हैं:

WITH cte AS(
    SELECT project_name,
           SUM(reward_value),
           DATE_TRUNC(date_signing, MONTH) as month,
           MAX(date_signing) as last_signing_date,
           Row_number() over (partition by DATE_TRUNC(date_signing, MONTH)
                                          order by SUM(reward_value) desc) AS rank
    FROM `deals`
    WHERE CAST(date_signing as DATE) > '2019-12-31' 
        AND CAST(date_signing as DATE) < '2020-02-01'
        AND target_category = 'achieved'
        AND project_name IS NOT NULL
    GROUP BY project_name, month
  
)

SELECT * FROM cte WHERE rank <= 5
0
eshirvana 4 पद 2020, 21:15