PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Abfrage absteigend Sortieren nach häufigkeit der Datensätze



markwaldhoff
13-06-2005, 12:20
Hi !

Ich habe das Problem das ich eine Tabelle in welcher ca 19000 Datensätze stehen nach der häufigkeit eines bestimmten Feldes sortieren möchte.

Das Feld FKT (Funktion des Ansprechpartners) besitzt in der Tabelle mehrfach vorkommende Ausprägungen die ich zusammenfassen möchte und dann nach der Häufigkeit des vorkommens sortieren möchte. Ich zeige das hier mal kurz an einem Beispiel:

Name FKT
--------------------------------
Mark Geschäftsführer
Dennis AZUBI
Mary Sängerin
Alex Transe
Heino AZUBI
Elisabeth WC-Frau
Heike AZUBI
Ciara Sängerin


Das Ergebnis sollte dann wie folgt aussehen:

AZUBI
Sängerin
Transe
Geschäftsführer


--> AZUBI kommt am häufigsten vor und sollte deshalb oben stehen, dann kommt die Sängerin usw....

Kann mir da jemand helfen ???
Mit group by bekomme ich zwar die doppelten weg, aber ich weiß nicht wie ich die dann absteigend nach häufigkeit sortiere.

Christoph
13-06-2005, 13:39
Lösungsweg: zunächst die Anzahlen mittels COUNT und GROUP BY selektieren, dann auf diesem Ergbenis mittels WHERE cnt=(SELECT MAX ...) die höchsten Einträge selektieren (geht auch mit ORDER BY und LIMIT).

Das alles geht auch in einem einzigen Statement, wenn Du Tabellenkonstruktoren verwendest, z.B.


select * from (SELECT ... ) x where ...

Das großgeschriebene Select ist der Tabellenkonstruktor.

mwanaheri
13-06-2005, 14:42
etwa so:
select fkt from
(select count(fkt),fkt from tabelle
group by fkt
order by count desc) x;

ps: in deinem Ergebnis fehlt die KloFrau ;-)

nul
13-06-2005, 20:34
Verschachtelte SQL-Abfragen sollte man mit Vorsicht geniessen, die schlagen bei einigen Datenbanken schwer auf die performence und sind nicht ueberall anwendbar!

sticky bit
13-06-2005, 22:13
Hmm, kann es gerade nicht ausprobieren, kann auch voelliger Bloedsinn sein, aber geht ein SELECT COUNT(*), fkt FROM table GROUP BY fkt ORDER BY 1; nicht?
Oder motzt er da?

mwanaheri
13-06-2005, 23:00
Hmm, kann es gerade nicht ausprobieren, kann auch voelliger Bloedsinn sein, aber geht ein SELECT COUNT(*), fkt FROM table GROUP BY fkt ORDER BY 1; nicht?
Oder motzt er da?

wow, das geht ja (kannte ich so noch nicht). Liefert allerdings mehr zurück als er haben will.

@nul: Was wäre denn die Alternative?

sticky bit
14-06-2005, 06:22
Liefert allerdings mehr zurück als er haben will.
Hmm, wenn das geht, dann geht SELECT fkt FROM table GROUP BY fkt ORDER BY COUNT(*); wahrscheinlich auch? Dann hat man die Zählerspalte nicht in der Ausgabemenge...

mwanaheri
14-06-2005, 11:16
Yo, also hier bei Postgres klappt das.
Allerdings habe ich es umformuliert:
select fkt from tabelle group by fkt order by count(fkt) desc;

Hübsch und klein, das muss ich sagen.
Allerdings sollte man glaube ich aufpassen, dass man nicht so kurzt formuliert, dass man später nicht mehr begreift, was man da gemacht hat.
Ein explain beider Varianten ergab bei mir keinen Unterschied in den Kosten.