Saran awal saya adalah salah :
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;
Ini secara keliru mengasumsikan bahwa agregasi luar (berdasarkan tanggal) akan memilih baris pertama dari tabel turunan dalam yang dipesan oleh cnt. Perilaku ini, pada kenyataannya, tidak terdefinisi dan tidak dijamin konsisten.
Inilah solusi yang tepat:
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;
Catatan:
Saya menambahkan (SELECT COUNT(*)) AS total
karena pertanyaannya menanyakan ini dalam satu kueri. Namun, ini tidak akan diskalakan karena merupakan subquery yang berkorelasi. Ini berarti bahwa untuk setiap t1.date subquery SELECT COUNT(*) akan dijalankan. Silakan lakukan benchmark dan lihat apakah kinerjanya sesuai dengan kebutuhan Anda. Jika tidak, maka saya sarankan untuk mendapatkan total harian dalam kueri terpisah. Anda akan menggabungkan hasil ini dalam aplikasi Anda.