Группируйте записи и сортируйте группы по себе - PullRequest
0 голосов
/ 20 января 2020

У меня есть 2 столбца в моей таблице цен : идентификатор_карты и цена

Я хочу

  • Сгруппируйте записи с одинаковыми car_id s и отсортируйте эти группы по цене . (а именно, все записи с одинаковым car_id должны быть перечислены последовательно.)

  • Я хочу отсортировать эти группы по минимальной цене, которую они включают.

Например,

car_id | price
---------------
1      |   2
1      |   5
2      |   3
2      |   1
2      |   10
3      |   7
3      |   3
3      |   8

должно быть отсортировано так:

car_id | price
---------------
2      |   1
2      |   3
2      |   10
1      |   2 
1      |   5 
3      |   3 
3      |   7 
3      |   8

Как мне написать запрос, который выполняет эту операцию? Я использую MySQL V5.6.

Ответы [ 3 ]

3 голосов
/ 20 января 2020

Вы можете использовать подзапрос, поскольку 5.6 не поддерживает оконные функции.

select *, 
  (
    select min(price) 
    from datatab d2
    where d1.car_id = d2.car_id
  ) min_price
from datatab d1
order by min_price, car_id, price

DBFIDDLE DEMO

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

Вы можете использовать подзапрос, который возвращает минимальную цену для каждого car_id в предложении ORDER BY:

select t.*
from tablename t
order by 
  (select min(price) from tablename where car_id = t.car_id), 
  car_id, 
  price

См. Демонстрационную версию . Или присоедините таблицу к подзапросу, который возвращает все минимальные цены:

select t.*
from tablename t inner join (
  select car_id, min(price) minprice
  from tablename 
  group by car_id
) m on m.car_id = t.car_id
order by 
  m.minprice, 
  t.car_id, 
  t.price 

См. Демоверсию . Результаты:

| car_id | price |
| ------ | ----- |
| 2      | 1     |
| 2      | 3     |
| 2      | 10    |
| 1      | 2     |
| 1      | 5     |
| 3      | 3     |
| 3      | 7     |
| 3      | 8     |
1 голос
/ 20 января 2020

Вы можете использовать оконные функции в order by:

select p.*
from pricing p
order by min(price) over (partition by car_id),
         car_id;

. car_id обрабатывает случай, когда несколько car_id s имеют одинаковую минимальную цену.

В более старом версии MySQL, вы можете сделать что-то подобное с подзапросом:

select p.*
from pricing p
order by (select min(p2.price) from pricing p2 where p2.car_id = p.car_id),
         car_id;
...