ПОРЯДОК SQL ПО, но также и по минутам разных col (он же threading)?

#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