Сортировка групп
Результат запроса с GROUP BY — такая же таблица, как любая другая, и сортируется она с помощью ORDER BY. Её можно сортировать по столбцу, по которому вы группируете, как в предыдущем упражнении, а можно и по агрегатной функции. В каких жанрах больше всего игр?
SELECT genre, COUNT(*) AS game_count
FROM games
GROUP BY genre
ORDER BY COUNT(*) DESC;| genre | game_count |
|---|---|
| Action | 4 |
| Strategy | 3 |
| Adventure | 3 |
| Sports | 2 |
| … | … |
Вместо того чтобы писать функцию ещё раз, можно отсортировать по её псевдониму: ORDER BY game_count DESC. Это короче, и когда вы потом измените функцию, менять придётся только в одном месте. В конце этого урока вы узнаете, почему псевдоним работает в ORDER BY и где он не работает.
Но посмотрите на результат. У Adventure и Strategy по 3 игры, а ещё у пяти жанров по 2. Здесь жанры с одинаковым числом игр случайно идут в обратном алфавитном порядке, но никакой порядок не гарантирован: другая версия базы данных или та же с большим количеством данных может вернуть их иначе. Как вы знаете из урока 2, ничьи решает второй столбец сортировки:
SELECT genre, COUNT(*) AS game_count
FROM games
GROUP BY genre
ORDER BY game_count DESC, genre;| genre | game_count |
|---|---|
| Action | 4 |
| Adventure | 3 |
| Strategy | 3 |
| Puzzle | 2 |
| … | … |
С помощью LIMIT можно получить верхние группы. Три жанра с самой высокой средней ценой:
SELECT genre, ROUND(AVG(price), 1) AS average_price
FROM games
GROUP BY genre
ORDER BY average_price DESC
LIMIT 3;| genre | average_price |
|---|---|
| RPG | 50.0 |
| Sports | 47.5 |
| Action | 32.5 |
Типичная ошибка: LIMIT 1 для «жанра с наибольшим количеством игр», когда есть ничья. Если первое место делят две группы, LIMIT 1 покажет одну из них, а о другой вы так и не узнаете. Прежде чем обрезать результат, посмотрите ещё несколько строк и всегда добавляйте второй столбец сортировки, чтобы знать, какую из групп с равным значением вы получили.
Задание
- 1
Какие клиенты сделали больше всего заказов? Измените запрос так, чтобы он сортировал их по убыванию числа заказов, клиентов с одинаковым числом — по
customer_id, и показывал только первые 3 строки:customer_id order_count 1 4 3 4 2 3 - 2
Ниже покажите 3 игры, которые клиенты заказали на самую большую сумму, включая возвращённые заказы:
game_idи суммуquantity * priceизorder_itemsв столбцеitems_value, от самой большой:game_id items_value 15 180 1 160 20 105