Problem:
Zagregowałeś dane w grupy, ale chcesz posortować rekordy w kolejności malejącej według liczby elementów w grupach.
Przykład:
Nasza baza danych zawiera tabelę o nazwie user
z danymi w następujących kolumnach:id
, first_name
, last_name
i country
.
id | imię | nazwisko | kraj |
---|---|---|---|
1 | Lisa | Williams | Anglia |
2 | Gary | Andersa | Polska |
3 | Tomek | Williams | Polska |
4 | Michael | Brązowy | Francja |
5 | Zuzanna | Kowalski | USA |
6 | Anna | Jones | USA |
7 | Elia | Młynarz | Polska |
Stwórzmy raport o naszych użytkownikach. Pogrupujemy wyniki według country
i policz liczbę użytkowników z każdego kraju. Ale posortujemy również grupy w kolejności malejącej według liczby użytkowników. W ten sposób kraje z największą liczbą użytkowników pojawią się na górze.
Rozwiązanie:
SELECT country, COUNT(id) FROM user GROUP BY country ORDER BY COUNT(id) DESC ;
kraj | liczba(id) |
---|---|
Polska | 3 |
USA | 2 |
Anglia | 1 |
Francja | 1 |
Dyskusja:
Aby posortować wybrane rekordy według liczby elementów w każdej grupie, użyj ORDER BY
klauzula.
Pierwszym krokiem jest użycie GROUP BY
klauzula tworzenia grup (w naszym przykładzie grupujemy według country
kolumna). Następnie w klauzuli ORDER BY używasz funkcji agregującej COUNT, która zlicza liczbę wartości w wybranej kolumnie; w naszym przykładzie liczymy różne identyfikatory za pomocą COUNT(id)
. To skutecznie zlicza liczbę elementów w każdej grupie. ORDER BY
następnie sortuje grupy zgodnie z tym obliczeniem.
Jak zwykle, możesz użyć zarówno porządku rosnącego, jak i malejącego z ORDER BY
. Jeśli chcesz porządku malejącego (jak w tym przykładzie), użyj DESC
słowo kluczowe. Kolejność rosnąca nie wymaga żadnego słowa kluczowego, ponieważ jest to ustawienie domyślne, ale możesz użyć ASC
słowo kluczowe, jeśli chcesz być wyraźny. To jest ten sam przykład, ale z wynikami posortowanymi w porządku rosnącym:
Rozwiązanie:
SELECT country, COUNT(id) FROM user GROUP BY country ORDER BY COUNT(id);
Oto wynik:
kraj | liczba(id) |
---|---|
Anglia | 1 |
Francja | 1 |
USA | 2 |
Polska | 3 |