Выберите самый верхний недублированный элемент после упорядочения по другим столбцам [дубликаты]

0

Я хотел бы выбрать запись "самая большая" для каждой строки с дублируемым значением столбца.

Выполнение следующего запроса -

SELECT *
FROM shop
ORDER BY shop.start_date DESC, shop.created_date DESC;

Я получаю набор результатов -

+--------+---------+------------+--------------+
| row_id | shop_id | start_date | created_date |
+--------+---------+------------+--------------+
| 1      | 1       | 2017-02-01 | 2017-01-01   |
| 2      | 1       | 2017-01-01 | 2017-02-01   |
| 3      | 2       | 2017-01-01 | 2017-07-01   |
| 4      | 2       | 2017-01-01 | 2017-01-01   |
+--------+---------+------------+--------------+

Могу ли я изменить SELECT чтобы получить только "верхние строки" для каждого уникального shop_id - в этом случае row_id 1 и 3. Может быть 1..n количество строк с одним и тем же shop_id.

Аналогично, если мой запрос выше вернул следующий порядок, я бы хотел только SELECT row_id 1 и 4, так как это были бы "самые популярные" записи в каждом shop_id.

+--------+---------+------------+--------------+
| row_id | shop_id | start_date | created_date |
+--------+---------+------------+--------------+
| 1      | 1       | 2017-02-01 | 2017-01-01   |
| 2      | 1       | 2017-01-01 | 2017-02-01   |
| 4      | 2       | 2017-01-01 | 2017-07-01   |
| 3      | 2       | 2017-01-01 | 2017-01-01   |
+--------+---------+------------+--------------+
Теги:

2 ответа

0
Лучший ответ

Вы можете сделать это, используя подзапрос:

select s.* 
from shop s 
where s.row_id = (
  select row_id 
  from shop 
  where shop_id = s.shop_id 
  order by start_date desc, created_date desc 
  limit 1
)   

Имейте в виду, что row_id является uniq для каждого shop_id в этом примере запроса.

демонстрация

Или вот так:

select t.*
from shop t
join (
 select t2.shop_id, t2.start_date, max(t2.created_date) as created_date 
 from shop t2
 join (
   select max(start_date) as start_date, shop_id
   from shop
   group by shop_id
 ) t3 on t3.shop_id = t2.shop_id and t3.start_date = t2.start_date
 group by t2.shop_id, t2.start_date
) t1 on t1.shop_id = t.shop_id and t.start_date = t1.start_date and t.created_date = t1.created_date

Имейте в виду, что в случае, если в одном и том же shop_id могут быть записи с тем же start_date и created_date вам нужно будет использовать другую group by s.shop_id, s.start_date, s.created_date во внешнем запросе (добавив min(row_id) с другими столбцами перечисленные в group by select)

демонстрация

  • 0
    Я добавил немного другой пример, который я не могу заставить работать с вашей демонстрацией.
  • 0
    @macbombe: обновлено
Показать ещё 2 комментария
0

Попробуйте присоединиться к подзапросу, который находит "верхние" строки для каждого shop_id:

SELECT t1.*
FROM shop t1
INNER JOIN
(
    SELECT shop_id, MIN(row_id) AS min_id
    FROM shop
    GROUP BY shop_id
) t2
    ON t1.shop_id = t2.shop_id AND
       t1.row_id = t2.min_id
ORDER BY
    t1.start_date DESC,
    t1.created_date DESC;

Изображение 174551

демонстрация

Ещё вопросы

Сообщество Overcoder
Наверх
Меню