После выполнения следующего оператора:
SELECT Category FROM MonitoringJob ORDER BY CreationDate DESC
Я получаю из базы данных следующие значения:
test3
test3
bildung
test4
test3
test2
test1
но я хочу удалить дубликаты, например:
bildung
test4
test3
test2
test1
Я пытался использовать DISTINCT, но он не работает с ORDER BY в одном выражении. Пожалуйста помоги.
Важный:
Я пробовал это с:
SELECT DISTINCT Category FROM MonitoringJob ORDER BY CreationDate DESC
это не работает.
Заказ по CreationDate очень важен.
Ответы:
Проблема в том, что столбцы, используемые в
ORDER BY
, не указаны вDISTINCT
. Для этого вам нужно использовать агрегатную функцию для сортировки и использоватьGROUP BY
для выполненияDISTINCT
работы.Попробуйте что-то вроде этого:
источник
Ключевые столбцы расширенной сортировки
Причина, по которой то, что вы хотите сделать, не работает, заключается в логическом порядке операций в SQL , который для вашего первого запроса (упрощенно):
FROM MonitoringJob
SELECT Category, CreationDate
т.е. добавить так называемый расширенный ключевой столбец сортировкиORDER BY CreationDate DESC
SELECT Category
т.е. снова удалите столбец расширенного ключа сортировки из результата.Таким образом, благодаря стандартной функции расширенного ключевого столбца сортировки SQL , можно полностью упорядочить то, чего нет в
SELECT
предложении, потому что оно временно добавляется к нему за кулисами.Итак, почему это не работает
DISTINCT
?Если мы добавим
DISTINCT
операцию, она будет добавлена междуSELECT
иORDER BY
:FROM MonitoringJob
SELECT Category, CreationDate
DISTINCT
ORDER BY CreationDate DESC
SELECT Category
Но теперь, с расширенным ключевым столбцом сортировки
CreationDate
, семантикаDISTINCT
операции была изменена, поэтому результат больше не будет прежним. Это не то, что мы хотим, поэтому и стандарт SQL, и все разумные базы данных запрещают такое использование.обходные
Его можно эмулировать с помощью стандартного синтаксиса следующим образом
Или просто (в данном случае), как показал также Прутсвондер
Я подробно писал о SQL DISTINCT и ORDER BY здесь .
источник
DISTINCT ON
работает, и почти уверен, что это не поможет. Выражение в круглых скобках - это то, что используется для определения отличимости (условия группировки). Если есть разные категории с одинаковымиCreationDate
именами, то в результате появится только одна из них! Так как мне было интересно, не ошибся ли я в чем-то, я также загрузил пример базы данных в ваш блог, чтобы перепроверить:DISTINCT ON
запрос, который вы там дали, дал в общей сложности 1000 результатов (с большим количеством дубликатовlength
), в то время как запрос ниже дал всего 140 (уникальных) значений.DISTINCT
(нетON
), а другой -DISTINCT ON
. Обратите внимание, что последнее явно не удаляет повторяющиеся длины, а дублирующие заголовки. Думаю, что мой ответ здесь совершенно правильный.DISTINCT ON
условия удаляют дубликаты с использованием неправильного условия. В вашем сообщении в блогеDISTINCT ON
запрос действительно удаляет повторяющиеся заголовки , однакоDISTINCT
запрос над ним и запрос под ним (который, как вы утверждаете, является «синтаксическим сахаром») удаляют повторяющиеся длины , что, по-видимому, и является всей целью. То же самое применимо и здесь: OP хочет удалить повторяющиеся категории , а не дублировать CreationDates, как этоDISTINCT ON
делает запрос. Если вы мне все еще не верите, проверьте сами.Если вывод MAX (CreationDate) не требуется - как в примере исходного вопроса - единственным ответом является второе утверждение ответа Прашанта Гупты:
Объяснение: вы не можете использовать предложение ORDER BY во встроенной функции, поэтому оператор в ответе Prutswonder не может использоваться в этом случае, вы не можете поместить вокруг него внешний выбор и отбросить часть MAX (CreationDate).
источник
Просто используйте этот код, если вам нужны значения столбцов [Категория] и [CreationDate]
Или используйте этот код, если вам нужны только значения столбца [Категория].
У вас будут все отличные записи, какие захотите.
источник
Event
вы можете писать[Event]
вместо того,Event
чтобы SQL не вызывал ошибку синтаксического анализа.Исходные результаты показали, что "test3" дал несколько результатов ...
Очень легко начать использовать MAX постоянно, чтобы удалить дубликаты в Group By ... и забыть или проигнорировать основной вопрос ...
ОП предположительно понял, что использование MAX дает ему последнее «созданное», а использование MIN дает первое «созданное» ...
источник
MAX
, а не что-то отдельное в качестве ответа на вопрос.источник
По подзапросу он должен работать:
источник
Distinct отсортирует записи в порядке возрастания. Если вы хотите отсортировать по убыванию, используйте:
Если вы хотите отсортировать записи на основе поля CreationDate, это поле должно быть в операторе выбора:
источник
Вы можете использовать CTE:
источник
Попробуйте следующий, но это бесполезно для огромных данных ...
источник
ORDER BY
в подзапросах абсолютно допустимо. А кто-то даже проголосовал за ваш неверный комментарий.Это можно сделать с помощью внутреннего запроса.
источник
источник