Почему одинаковый отчёт показывает строки в разном порядке. Разбираем сортировку, совпадения значений и надёжное разбиение списка на страницы.
Те же данные, другой список
Вчера менеджер открыл список заказов и увидел одну последовательность. Сегодня записи те же, но некоторые поменялись местами. Это не обязательно ошибка хранения. Набор строк и порядок их показа — разные свойства результата. Если порядок не задан однозначно, привычный вид таблицы может оказаться случайностью.
Вопрос особенно заметен в списках «первые десять», выгрузках и отчётах с несколькими страницами. Пользователь рассчитывает продолжить просмотр с места остановки, а система должна понимать, что именно делает одну строку следующей. Одного общего обещания «показывать свежие заказы» для этого недостаточно.
Почему таблица не похожа на очередь
У очереди есть очевидное правило: кто пришёл раньше, тот стоит впереди. Таблица базы данных сама по себе такого обязательства не задаёт. То, что при нескольких открытиях записи выглядели одинаково, ещё не делает эту последовательность гарантированной.
В документации PostgreSQL о сортировке прямо объясняется: без явно выбранного порядка строки могут возвращаться в неопределённой последовательности. Пользователю не нужно знать внутреннее устройство базы, чтобы сформулировать требование: например, сначала более поздние оплаты, а при равенстве времени — по номеру заказа.
Одного признака бывает мало
Рассмотрим условный список из четырёх заказов. Три заказа оплачены в 10:00, четвёртый — в 10:05. Сортировка по времени объясняет место четвёртого, но не определяет взаимный порядок первых трёх. Все они равны по выбранному признаку, хотя это разные покупки.
Добавим второе правило: среди оплат с одинаковым временем располагать заказы по их уникальному номеру. Тогда появляется однозначная последовательность. Важно, чтобы номер действительно различал записи в рассматриваемом наборе. Если после объединения таблиц один заказ представлен несколькими строками, одного номера заказа может снова не хватить.
Почему это влияет на страницы
Представим, что на первой странице помещается две записи, а три покупки имеют одинаковое время. При неустойчивом порядке одна из них может оказаться то в первой паре, то в следующей. Пользователь воспринимает это как пропуск или повтор, даже если сами покупки не исчезли.
Документация PostgreSQL об ограничении результата рекомендует однозначный порядок при получении части строк. Но это решает только одну задачу. Если между просмотрами добавились новые заказы, состав страниц может сместиться даже при правильной сортировке. Для воспроизводимой выгрузки нужно также согласовать момент, на который фиксируется набор данных.
Не путайте равенство со случайным дублем
Два клиента могут иметь одинаковые фамилии, две покупки — одинаковую сумму, несколько операций — одинаковое время. Это ещё не делает записи дублями. Удалять одну из них ради красивого порядка опасно: изменится содержание отчёта, а не только его внешний вид.
Для различения объектов полезно понимать назначение ключей в базе данных. Отдельная задача — считать уникальных людей или покупок. О ней есть статья почему сумма уникальных клиентов не равна общему итогу. Правило подсчёта не заменяет правило сортировки.
Как описать ожидаемое поведение
В задании на отчёт укажите основной признак, направление сортировки и способ разрешения совпадений. Также договоритесь, где показывать записи без значения: например, заказы без даты оплаты. Такое решение должно отражать задачу пользователя, а не случайный порядок в источнике.
Для проверки достаточно небольшого условного набора: несколько равных дат, повторяющиеся суммы и одна отсутствующая дата. Откройте соседние страницы и сравните результат с оговорёнными правилами. Затем повторите проверку с добавлением новой записи. Так станет понятно, требуется ли живой обновляемый список или зафиксированный отчёт за период: это два разных режима использования.
Что изучить дальше
Продолжить обучение можно по программе SQL инженер. Сопоставьте её содержание со своей задачей и текущей подготовкой.


