Erhalte den gebräuchlichsten Wert für jeden Wert einer anderen Spalte in SQL
Ich habe eine Tabelle wie diese:
Column | Type | Modifiers
---------+------+-----------
country | text |
food_id | int |
eaten | date |
Und für jedes Land, ich will das Essen, das gegessen wird, am häufigsten. Die besten, die ich denken kann (ich bin mit postgres):
CREATE TEMP TABLE counts AS
SELECT country, food_id, count(*) as count FROM munch GROUP BY country, food_id;
CREATE TEMP TABLE max_counts AS
SELECT country, max(count) as max_count FROM counts GROUP BY country;
SELECT country, max(food_id) FROM counts
WHERE (country, count) IN (SELECT * from max_counts) GROUP BY country;
In dieser letzten Aussage, die GROUP BY und max() sind notwendig, um Bande zu brechen, in denen zwei verschiedene Nahrungsmittel haben die gleiche Anzahl.
Dies scheint wie eine Menge Arbeit für etwas, was konzeptionell einfach. Gibt es eine mehr gerade nach vorne Weg, es zu tun?
InformationsquelleAutor der Frage Martin C. Martin | 2008-12-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
PostgreSQL-Einführung der Unterstützung für Fensterfunktionen in 8.4, das Jahr, nachdem diese Frage gestellt wurde. Es ist erwähnenswert, dass es gelöst werden könnte, die heute wie folgt:
Den oben genannten Bande brechen wird. Wenn Sie nicht wollen, um Bande zu brechen, Sie könnte verwenden DENSE_RANK() statt.
InformationsquelleAutor der Antwort pilcrow
Gut, ich schrieb dies in Eile und habe nicht überprüfen Sie es wirklich gut. Die sub-select-könnte Recht langsam ist, aber das ist der kürzeste und einfachste SQL-Anweisung, die ich denken konnte. Ich werde wahrscheinlich sagen, mehr, wenn ich weniger betrunken.
PS: achja, "foo" ist der name meiner Tabelle "Lebensmittel" enthaelt die Namen der Lebensmittel und "Land" den Namen des Landes. Beispiel-Ausgabe:
InformationsquelleAutor der Antwort jkramer
versuchen Sie dies:
InformationsquelleAutor der Antwort Jamal Hansen
Es ist jetzt noch einfacher: PostgreSQL-9.4 eingeführt, die
mode()
Funktion:gibt (wie user2247323 Beispiel):
Dokumentation ist hier zu sehen:
https://wiki.postgresql.org/wiki/Aggregate_Mode
https://www.postgresql.org/docs/current/static/functions-aggregate.html#FUNCTIONS-ORDEREDSET-TABLE
InformationsquelleAutor der Antwort jrouquie
Hier ist, wie es zu tun, ohne temporäre Tabellen:
Edit: vereinfachte
InformationsquelleAutor der Antwort JosephStyons
Ich weiß nicht, wie die MAX(.) GROUP BY, um Bande zu brechen... Es muss eine Möglichkeit integrieren gegessen Datum in das JOIN-in gewisser Weise willkürlich wählen Sie die jüngste...
Ich bin interessiert an der Abfrage-plan für diese Sache, wenn Sie führen Sie es auf Ihrem live-Daten!
InformationsquelleAutor der Antwort Matt Rogish
InformationsquelleAutor der Antwort Theo
Probieren Sie etwas wie dieses
Diese könnten alle in einer einzelnen select -, aber ich habe keine Zeit, um dreck, um es jetzt.
Glück.
InformationsquelleAutor der Antwort John MacIntyre
Hier ist eine Aussage, die ich glaube, gibt Ihnen, was Sie wollen, und ist einfach und prägnant:
Bitte lassen Sie mich wissen, was Sie denken.
BTW, die unterscheidbar Funktion ist nur verfügbar in Postgres.
Beispiel, Quelle Daten:
Ausgabe:
InformationsquelleAutor der Antwort JCF