Mein ursprünglicher Vorschlag war falsch :
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;
Dies geht fälschlicherweise davon aus, dass die äußere Aggregation (nach Datum) die erste Zeile der inneren abgeleiteten Tabelle auswählt, die nach cnt geordnet wurde. Dieses Verhalten ist tatsächlich undefiniert und es ist nicht garantiert, dass es konsistent ist.
Hier ist die richtige Lösung:
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;
Hinweis:
Ich habe den (SELECT COUNT(*)) AS total
hinzugefügt weil die Frage in einer Abfrage danach gefragt hat. Dies wird jedoch nicht skaliert, da es sich um eine korrelierte Unterabfrage handelt. Das bedeutet, dass für jedes t1.date die Unterabfrage SELECT COUNT(*) ausgeführt wird. Bitte vergleichen Sie und sehen Sie, ob es für Ihre Bedürfnisse geeignet ist. Wenn nicht, dann schlage ich vor, die Tagessummen in einer separaten Abfrage abzurufen. Sie würden diese Ergebnisse in Ihrer Anwendung zusammenführen.