2016-04-18 15 views
-1

Wie Zeilen auswählen, die zu der größten Gruppe gehören?Wählen Sie Zeilen aus der größten Gruppe mit SQL

Angenommen, wir haben folgende Tabelle gibt es zwei Kategorien/Gruppen: Fruits (die größeren) und Vegetables:

Name  | Category 
-------------------- 
Banana | Fruits 
Orange | Fruits 
Beetroot | Vegetables 

Wie SQL zu schreiben, die nur die Zeilen von der größten Gruppe wählen würden?

Banana 
Orange 
+2

Für welche DBMS möchten Sie eine Antwort? –

+0

Für Postgres-Datenbank. –

+0

Okay, benutze dann den zweiten Teil meiner Antwort. –

Antwort

3

Hier ist eine Antwort für Oracle:

select * 
from mytable 
where category = (select stats_mode(category) from mytable); 

Diese bekommt man eine einzige Kategorie. Im Falle einer Gleichheit erhalten Sie eine der Kategorien mit maximaler Anzahl beliebig.

Und hier ist eine Antwort auf DBMS nicht STATS_MODE unterstützt aber mit Standard-SQL-Fensterfunktionen:

select name, category 
from 
(
    select name, category, rank() over (order by cnt desc) as rnk 
    from 
    (
    select name, category, count(*) over (partition by category) as cnt 
    from mytable 
) counted 
) ranked 
where rnk = 1; 

Mit RANK erhalten Sie alle Kategorien mit einer maximalen Zählung. Wenn Sie nur eines von ihnen im Falle eines Unentschiedens wollen, fügen Sie category zu ORDER BY hinzu. (Danke für die Korrektur dnoeth.)

+0

'ROW_NUMBER' statt' RANK' funktioniert nicht, aber 'Kategorie' wird zu' ORDER BY' hinzugefügt. – dnoeth

+0

@dnoeth: Danke für die Korrektur. Du hast natürlich Recht. –

0

ich es herausgefunden (für PostgreSQL):

with mytable_count as (
    select category, count(category) as category_count 
    from mytable 
    group by category 
    order by category_count desc 
    limit 1 
) 
select mytable.* 
from mytable, mytable_count 
where mytable.category = mytable_count.category 
+0

Wenn es eine Gleichheit gibt (zwei verschiedene Kategorien mit derselben maximalen Anzahl), gibt diese Abfrage nur die Elemente einer Kategorie zurück. – jarlh

+0

Hey, du hast meine Antwort ignoriert ;-) Natürlich gibt es andere Möglichkeiten, dies zu lösen, z. Alle Kategorien zählen; bekomme die maximale Anzahl von diesen; Erhalte alle Kategorien mit dieser maximalen Anzahl; Holen Sie sich die Datensätze für diese Kategorien. Die Verwendung von Fensterfunktionen ist jedoch eleganter und in der Regel schneller, da Sie nur einmal auf die Tabelle zugreifen. –

Verwandte Themen