Упорядоченный и в то же время отдельный
У меня есть такие таблицы, как эта
id sku
1 C
2 B
3 C
4 A
Наконец, я хочу получить исходные данные вот так.
1 C
2 B
4 A
Сначала я использую distinct
queryset = self.filter_queryset(queryset.order_by('sku').distinct('sku'))
Он изображает raw следующим образом,
4 A
1 C
2 B
Тогда теперь я хочу отсортировать это по идентификатору,
queryset = queryset.order_by('id')
Однако он выдает ошибку, подобную этой,
django.db.utils.ProgrammingError: SELECT DISTINCT ON expressions must match initial ORDER BY expressions
LINE 1: SELECT DISTINCT ON ("defapp_log"."sku") "d...
DISTINCT ON( ... )
не поддерживается MySQL, поэтому, я полагаю, вы используете PostgreSQL. Это нестандартная функция, реализованная PostgreSQL как расширение SQL.
https://www.postgresql.org/docs/current/sql-select.html#SQL-DISTINCT говорит:
Выражения
DISTINCT ON
должны совпадать с крайними левыми выражениямиORDER BY
. ПредложениеORDER BY
обычно содержит дополнительные выражения, которые определяют желаемый приоритет строк в каждой группеDISTINCT ON
.
Другими словами, это правильно, потому что столбец sku
является крайним левым выражением в предложении ORDER BY
.
SELECT DISTINCT ON (sku), id FROM ... ORDER BY sku, id;
Но это неверно:
SELECT DISTINCT ON (sku), id FROM ... ORDER BY id;
Это не соответствует правилу, описанному в документации, поскольку столбец sku
отсутствует в предложении ORDER BY
.