Ma suggestion initiale était incorrecte :
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;
Cela suppose à tort que l'agrégation externe (par date) sélectionnera la première ligne de la table dérivée interne qui a été triée par cnt. Ce comportement est, en fait, indéfini et il n'est pas garanti qu'il soit cohérent.
Voici la bonne solution :
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;
Remarque :
J'ai ajouté le (SELECT COUNT(*)) AS total
parce que la question posée pour cela dans une requête. Cependant, cela ne sera pas mis à l'échelle car il s'agit d'une sous-requête corrélée. Cela signifie que pour chaque t1.date, la sous-requête SELECT COUNT(*) sera exécutée. Veuillez comparer et voir s'il fonctionne correctement pour vos besoins. Si ce n'est pas le cas, je suggère d'obtenir les totaux quotidiens dans une requête distincte. Vous fusionnerez ces résultats dans votre application.