Я хотел бы выбрать запись "самая большая" для каждой строки с дублируемым значением столбца.
Выполнение следующего запроса -
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 |
+--------+---------+------------+--------------+
Вы можете сделать это, используя подзапрос:
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
)
Попробуйте присоединиться к подзапросу, который находит "верхние" строки для каждого 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;