#mysql #sql #sorting #sql-order-by
#mysql #sql #сортировка #sql-order-by
Вопрос:
Что касается приведенных ниже примеров данных, то это ORDER BY Type
так, но каждая результирующая группа ORDER BY MIN(Valu)
не имеет какой-либо агрегации.
Type Valu
---- ----
B 12
B 88
B 200
B 200
A 56
A 100
A 100
C 70
C 70
Итак, все записи типа B перечислены первыми, потому что в этой группе есть запись, содержащая наименьшее значение (12). Затем введите записи A из-за записи с значением 56, а затем введите записи C из-за записи с значением (значениями) 70.
Есть ли какой-нибудь способ выполнить этот тип сортировки в SQL?
Чтобы объяснить далее, если бы я должен был сделать это программно, я мог бы сначала отсортировать записи по типу и, во-вторых, по значению decending . Но тогда мне нужно было бы отсортировать группы записей по значению первой записи каждой группы.
Итак, что-то вроде:
SELECT Type, Valu FROM data ORDER BY Type, Valu
большую часть пути я туда добираюсь. Но тогда я хочу отсортировать группы по наименьшему значению.
Это можно сравнить с «потоковой передачей» сообщений на форуме, где сообщения с одной и той же темой группируются вместе, но затем группы сортируются по дате последнего сообщения в группе (хотя потоковая обработка сообщений на форуме более сложна, потому что сортировка выполняется по порядку ответов, тогда как в моем примере я просто хочусортировка численно по значению).
Есть ли какой-нибудь способ сделать это в SQL? Если нет, и мне нужно сделать это программно, есть ли хотя бы запрос, который выдаст последние записи и любые записи того же типа, но с a LIMIT
, чтобы мне не нужно было извлекать все записи? Если есть две записи одного и того же типа, но одна с очень низким значением, а другая с разным высоким значением, предложение LIMIT может исключить запись с высоким значением.
Ответ №1:
Получите все типы и их минимальные значения в подзапросе и вернитесь к таблице. Затем вы можете упорядочить минимальное значение групп типов.
SELECT
table.Type,
table.value
FROM (
SELECT
Type,
min(value) AS minValue
FROM table
GROUP BY Type
) AS sub
INNER JOIN table
ON table.Type = sub.Type
ORDER BY sub.minValue ASC, table.Type ASC, table.value ASC
Комментарии:
1. Я подтвердил, что это работает с моим фактическим набором данных. Я очень впечатлен, лопо! Обратите внимание, что в конце есть опечатка, относящаяся к ‘table1’, которая должна быть просто ‘table’.
2. @ioplex Вам также нужно использовать
Type
в предложении order by, если вы хотите сохранить группы вместе, когда две группы имеют одинаковое минимальное значение.ORDER BY sub.minValue ASC, table.Type, table.value ASC
3. @Mikael Eriksson. Ваше право. Я исправляю свой запрос. Спасибо.
Ответ №2:
Вы можете попробовать использовать аналитические функции, если ваша СУБД их поддерживает (Oracle, MS SQL, Postgres …)
select Type,
Valu
from MyTable
order by Min(Valu) over (partition by Type),
Type,
Valu
Комментарии:
1. К сожалению, я использую mysql, который не поддерживает аналитические функции (хотя, по-видимому, есть некоторые возможные обходные пути). Но ответ lopo, похоже, работает до сих пор.
Ответ №3:
SELECT Type, Valu FROM data ORDER BY Type desc, Valu asc