Postgres: Почему выражения DISTINCT ON должны соответствовать крайнему левому выражению ORDER BY? - PullRequest
0 голосов
/ 23 апреля 2020

Почему я не могу получить первую отдельную строку с любым другим выражением в порядке, почему самое левое выражение должно быть тем же выражением, которое я использовал в DISTINCT ON?

1 Ответ

0 голосов
/ 23 апреля 2020

Ну, ORDER BY необходим для того, чтобы соединить те строки, которые имеют одинаковое значение для «отдельных столбцов». База данных обрабатывает их последовательно, отбрасывая все последующие строки из того же набора. Если бы строки не были отсортированы, это было бы нелегко.

Допустим, этот набор строк:

c1 | c2 
---+----
 1 | 100
 2 |  10
 1 | 200
 2 |  15

Если вы хотите, чтобы c1 был уникальным, и выберите самый высокий c2, вам нужно будет использовать

select distinct on (c1) *
from the_table
order by c1, c2 desc;

The * Сам 1009 * сгенерирует следующий результат:

c1 | c2 
---+----
 1 | 200
 1 | 100
 2 |  15
 2 |  10

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

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