Сортировка SQLite: обработка сначала по рейтингу, затем по имени

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Применяйте конструкцию ORDER BY для одновременной сортировки по нескольким критериям, перечисляя имена столбцов согласно их приоритетности:

SQL
Скопировать код
SELECT col1, col2 FROM table ORDER BY col1, col2 DESC;

В ORDER BY перечисление столбцов определяет очередность сортировки: первый столбец задает основной критерий, второй – второстепенный, и так далее. Указывайте ASC для сортировки по возрастанию и DESC для сортировки по убыванию.

Таким образом, сортировка списка сотрудников по отделам, а затем по зарплате в пределах каждого отдела по убыванию, будет выглядеть так:

SQL
Скопировать код
SELECT name, dept, salary FROM employees ORDER BY dept, salary DESC;

Результатом будет упорядоченный список сотрудников по отделам, внутри каждого из которых сотрудники будут отсортированы по зарплате от высокой к низкой.

Кинга Идем в IT: пошаговый план для смены профессии

Сложная сортировка с применением LIMIT

Во многих случаях надо ограничить количество выводимых результатов перед дальнейшей сортировкой. В SQLite для этого можно использовать вложенные запросы:

SQL
Скопировать код
-- SQLite версия: запрос внутри запроса! 🤯
SELECT * FROM ( 
  SELECT * FROM employees 
  ORDER BY rating DESC 
  LIMIT 20
) AS sub_query 
ORDER BY name ASC;

В этом примере:

  1. Внутренний запрос сортирует сотрудников в порядке убывания их рейтинга и ограничивает результат 20-ю наивысшими позициями.
  2. Внешний запрос упорядочивает полученные данные по именам сотрудников в алфавитном порядке.

Таким образом, достигается двухэтапная сортировка, позволяющая точно выбрать нужную подгруппу данных.

Сортировка в многотабличных ситуациях

В случае работы с большими и сложными наборами данных, например, с несколькими связанными таблицами или при необходимости учитывать несколько критериев сортировки, вложенные запросы и общие табличные выражения (CTE) представляют собой мощное решение:

SQL
Скопировать код
-- Третий уровень сновидения запроса. Надеемся, вы не заблудились...
WITH RankedEmployees AS (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) as rank
  FROM employees
)
SELECT * FROM RankedEmployees
WHERE rank <= 5
ORDER BY department, rank;

Аспекты данного примера, обеспечивающие его эффективность:

  • CTE: возможность структурировать и ясно представлять многоуровневую сортировку.
  • ROW_NUMBER(): присвоение ранга сотрудникам внутри каждого отдела, основанное на сортировке их зарплат в порядке убывания.
  • PARTITION BY: разграничение групп внутри отдела для применения к ним правил сортировки.
  • WHERE: выбор пяти лучших по зарплате сотрудников из каждого отдела.

Визуализация

Представьте многоуровневую сортировку как процесс упорядочивания игральных карт 🃏:

Markdown
Скопировать код
1️⃣ Сначала сортируем их по мастям: [♦️, ♥️, ♠️, ♣️]
2️⃣ Затем в пределах каждой масти располагаем карты в порядке их достоинства: [Т, 2, 3, ... К]

Вот как могут выглядеть карты до и после сортировки:

Markdown
Скопировать код
До: [3♣️, К♥️, 5♦️, Т♠️, 2♥️]
После: [5♦️, К♥️, 2♥️, Т♠️, 3♣️]

Аналогично, многоуровневая сортировка в базах данных создает упорядоченные группы (слои), причем каждый следующий слой учитывает правила предыдущих, как при построении здания этаж за этажом 🏢.

Динамическая сортировка с помощью оператора CASE

В SQL оператор CASE предоставляет возможности динамической сортировки, когда требуется учесть определенные условия:

SQL
Скопировать код
-- Не все условия одинаково важны! 🏆
SELECT col1, col2, col3 FROM table
ORDER BY CASE WHEN condition THEN 1 ELSE 2 END, col2 ASC;

Оператор CASE позволяет определить, что при выполнении определенного условия соответствующие записи получат приоритет в сортировке, и затем будут включены в список. Посторонняя сортировка по col2 применяется уже после этого.

Сортировка с TIMESTAMP

Работая с TIMESTAMP, особенно без указания часового пояса, часто требуется сортировка только по дате, отбрасывая временной компонент:

SQL
Скопировать код
-- Когда речь идет о датах, время не важно! 📅
SELECT col1, col2, DATE(col3) as DateOnly
FROM table
ORDER BY DATE(col3), col1;

Таким образом, производится сортировка только по дате, извлеченной из метки времени, без учета точного времени. Это может быть весьма полезно при работе с временными данными.

Полезные материалы

  1. ORDER BY Clause (Transact-SQL) – SQL Server | Microsoft Learn — Обстоятельное руководство от Microsoft по применению ORDER BY.
  2. SQL ORDER BY | Basic SQL – Mode — Руководство с примерами применения сортировки в SQL на реальных данных.
  3. SQL ORDER BY Keyword – W3Schools — Отличный справочник по SQL ORDER BY, рассчитанный на широкую аудиторию.
  4. Robyn Page's SQL Server DATE/TIME Workbench – Simple Talk — Практическое руководство от Робин Пэйдж по работе с данными DATE/TIME в SQL с множеством примеров.
  5. regex – how to extract floating numbers from strings in javascript – Stack Overflow — Вопрос на Stack Overflow, неявно связанный с SQL, полезный для освоения методов извлечения данных для работы с SQL-запросами.