MySQL: Как заказать данные в каждой группе? - PullRequest
1 голос
/ 15 января 2020

У меня есть такая таблица:

| Key | Value | Message |
|-----|-------|---------|
| a   | 1     | xx      |
| a   | 2     | yy      |
| b   | 5     | mm      |
| b   | 4     | nn      |

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

| Key | Value | Message |
|-----|-------|---------|
| a   | 1     | xx      |
| b   | 4     | nn      |

Я использую MySQL 5.7. Возможно ли это сделать?

Ответы [ 5 ]

2 голосов
/ 15 января 2020

Вы можете попробовать ниже -

select * from tablename a
where value = (select min(value) from tablename b where a.key=b.key)
1 голос
/ 15 января 2020

Канонический способ справиться с этим в MySQL 5.7 или более ранних версиях - присоединиться к подзапросу, который находит наименьшее значение для каждого ключа:

SELECT t1.`Key`, t1.`Value`, t1.Message
FROM yourTable t1
INNER JOIN
(
    SELECT `Key`, MIN(`Value`) AS min_value
    FROM yourTable
    GROUP BY `Key`
) t2
    ON t1.`Key` = t2.`Key` AND t1.`Value` = t2.min_value
ORDER BY
    t1.`Key`;

Пожалуйста, попытайтесь избегайте именования ваших столбцов и других объектов базы данных, используя зарезервированные ключевые слова SQL, такие как Key и Value. Вы можете рассмотреть необходимость ввода обратных галочек в запросе MySQL как анти-шаблон.

1 голос
/ 15 января 2020

Вы можете использовать row_number():

select t.*
from (select t.*, row_number() over (partition by key order by value) as seq
      from table t
     ) t
where seq = 1;

Вы также можете использовать коррелированный subquery, если функция ранжирования не поддерживает:

select t.*
from table t
where t.value = (select min(t1.value) from table t1 where t1.key = t.key);
0 голосов
/ 15 января 2020

Используйте этот запрос

select * from table_name tab1
where value in ( select MIN(value) from table_name tab2
                where tab2.[key] = tab1.[key] )
0 голосов
/ 15 января 2020

Сначала создайте подзапрос, который возвращает min value для каждого key, затем объединитесь с основной таблицей:

select t.* 
from tablename t
inner join (
   select key, min(value) min_value
   from tablename
   group by key
) i on i.key = t.key and i.min_value = t.value
...