Ich benutze Postgresql 9.0. Ich habe die folgenden Felder in einer Tabelle : id, name
.
id name
1 John
1 Mary
1 Mary
1 Mary
1 John
1 Mary
3 Paul
3 Paul
3 George
. .
. .
Für jeden id
möchte ich den Namen auswählen, der am häufigsten vorkommt. Wie kann ich das machen?
Ich habe es mit der folgenden Abfrage versucht, aber es funktioniert nicht:
select id, max(name)
from table
group by id;
postgresql
postgresql-9.0
Tudor
quelle
quelle
max
findet den Namen, der zuletzt lexikalisch sortiert wird, nicht den Namen, der am häufigsten vorkommt. Sie wollen wirklich einmode
(im statistischen Sinne) Aggregat dafür, und ich glaube nicht, dass eines angeboten wird. Jemand hat einen im Wiki geschrieben, aber ich bezweifle, dass er sehr effizient ist. Probieren Sie es aus: wiki.postgresql.org/wiki/Aggregate_Mode und scottrbailey.wordpress.com/2009/05/22/…Antworten:
Das ist nicht trivial. Zunächst möchten Sie nach ID und Name gruppieren und die Zeilen zählen:
Wählen Sie dann die maximale Anzahl für jede ID. Eine Möglichkeit, dies zu erreichen, sind Fensterfunktionen. Die
RANK()
Funktion:Weist jeder Zeile des Ergebnisses eine Nummer zu (nachdem die Gruppierung abgeschlossen ist), ordnet sie (die Zeilen) in Partitionen mit derselben an
id
und sortiert nachCOUNT(*) DESC
, sodass für jede (Partition von)id
die Zeile (n) mit der maximalen Anzahl sind zugewiesen einen Rang von 1. Daher müssen wir das Obige in eine abgeleitete Tabelle einfügen und eineWHERE
Bedingung verwenden, um nur diese Zeilen zu behalten:Die letzte Abfrage lautet wie folgt:
Getestet bei SQL-Fiddle
Beachten Sie, dass alle diese zurückgegeben werden, wenn Sie in erster Linie Verbindungen haben (zwei oder mehr Namen mit derselben maximalen Anzahl). Wenn Sie in den Endergebnissen nur eine Zeile pro ID wünschen, müssen Sie
ROW_NUMBER()
anstelleRANK()
derORDER BY
Klausel die Klausel verwenden und möglicherweise ändern , um explizit auszuwählen, wie die Bindungen aufgelöst werden sollen:Getestet: SQL-Fiddle Test-2 .
quelle
FROM
Klausel angezeigt wird . Was steht in den Klammern in meinem Code (benannttg
)