Moja początkowa sugestia była nieprawidłowa :
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;
To błędnie zakłada, że agregacja zewnętrzna (według daty) wybierze pierwszy wiersz wewnętrznej tabeli pochodnej, która została uporządkowana według cnt. To zachowanie jest w rzeczywistości niezdefiniowane i nie ma gwarancji, że będzie spójne.
Oto właściwe rozwiązanie:
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;
Uwaga:
Dodałem (SELECT COUNT(*)) AS total
ponieważ pytanie o to prosiło w jednym zapytaniu. Nie będzie to jednak skalowane, ponieważ jest to skorelowane podzapytanie. Oznacza to, że dla każdej daty t1. zostanie uruchomione podzapytanie SELECT COUNT(*). Proszę porównać i sprawdzić, czy działa odpowiednio do Twoich potrzeb. Jeśli nie, sugeruję uzyskanie dziennych sum w osobnym zapytaniu. Połączysz te wyniki w swojej aplikacji.