मेरा प्रारंभिक सुझाव गलत था :
SELECT
date, item, SUM(cnt)
FROM (
SELECT
date, item, count(item_id) AS cnt
FROM test_popularity
GROUP BY date, item_id
ORDER BY cnt DESC
) t
GROUP BY date;
यह गलती से मानता है कि बाहरी एकत्रीकरण (तारीख के अनुसार) आंतरिक व्युत्पन्न तालिका की पहली पंक्ति का चयन करेगा जिसे सीएनटी द्वारा आदेश दिया गया था। यह व्यवहार, वास्तव में, अपरिभाषित है और सुसंगत होने की गारंटी नहीं है।
यहाँ उचित समाधान है:
SELECT
t1.date, t1.item,
(SELECT COUNT(*) FROM test_popularity WHERE date = t1.date) as total
# see note!
FROM test_popularity t1
JOIN (
SELECT date, item, item_id, COUNT(item_id) as count
FROM test_popularity
GROUP BY date, item_id
) AS t2
ON t1.date = t2.date AND t1.item_id = t2.item_id
GROUP BY t1.date;
नोट:
मैंने (SELECT COUNT(*)) AS total
. जोड़ा क्योंकि प्रश्न ने इसके लिए एक प्रश्न में पूछा था। हालाँकि, यह पैमाना नहीं होगा क्योंकि यह एक सहसंबद्ध उपश्रेणी है। इसका मतलब है कि प्रत्येक t1.date के लिए SELECT COUNT(*) सबक्वेरी चलेगी। कृपया बेंचमार्क करें और देखें कि क्या यह आपकी आवश्यकताओं के लिए उपयुक्त प्रदर्शन करता है। यदि नहीं, तो मैं एक अलग प्रश्न में दैनिक योग प्राप्त करने का सुझाव देता हूं। आप इन परिणामों को अपने आवेदन में मर्ज कर देंगे।