SQL: для города, для продукта - последний идентификатор заказа - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть таблицы: tbl-city

id   city
---------
1     A
2     B
3     C

tbl-orders

ord_id   product_id   city   date
----------------------------------
1          1             1   12/3/18
2          1             2   13/3/18
3          2             3   12/4/18
4          1             3   14/4/18
5          3             2   11/2/18
6          1             1   15/1/18
7          2             3   15/4/28

Мне нужно получить все последние Id из таблицы orders по по городу и продукту с использованием дата

Как это:

ord_id   product_id   city
---------------------------
  1           1          1
  2           1          2
  7           2          3
  5           3          2

Как я могу получить это?

ПРИСОЕДИНЯЙТЕСЬ / ВНУТРЕННЕЕ СОЕДИНЕНИЕ или любым другим способом?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Если ord_id увеличивается вместе с датой (как обычно), тогда работает простая агрегация.

select product_id, city, max(ord_id)
from tbl_ord
group by product_id, city;

В противном случае типичный метод будет использовать row_number():

select o.*
from (select o.*,
             row_number() over (partition by product_id, city order by date desc) as seqnum
      from tbl_ord o
     ) o
where seqnum = 1;

В более старых версиях MySQL коррелированный подзапрос является хорошим маршрутом.Но если вы хотите ровно одну строку для каждого продукта и города, используйте ord_id:

select o.*
from tbl_ord o
where o.ord_id = (select o2.ord_id
                  from tbl_ord o2
                  where o2.product_id = o.product_id and o2.city = o.city
                  order by o2.date desc
                  limit 1
                 );
0 голосов
/ 30 ноября 2018

Вы можете использовать коррелированный подзапрос:

select o.*
from orders o
where date = (select max(o1.date)
              from orders o1
              where o1.product_id = o.product_id and o1.city = o.city
             );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...