#sql
#sql
Вопрос:
Я безуспешно пытался «объединить» два запроса, чтобы получить дату последнего обновления продукта с последней ценой.
Взгляните на это:
У меня есть 2 разные таблицы: products_table и products_prices
В таблице products_table у меня есть все разные продукты, и каждый раз, когда изменяется атрибут, поле last_update_date также изменяется.
Если я хочу получить последнее обновление продукта, я использую этот запрос:
select a.item,a.last_update_date from products_table a inner join
(Select item, max(last_update_date) updates from products_table
group by item) b
on a.item=b.item --item is the product_id
and a.last_update_date=b.updates
Кроме того, у меня есть таблица products_prices, которая содержит все разные цены на продукты, и если я хочу получить последнюю цену продукта, я использую этот запрос (фильтрация по request_id):
select * from products_prices a
where item_code = ''--Product_id
and request_id = (select max(request_id) from products_prices b where a.item_code=b.item_code);
Проблема в том, что я не знаю, как объединить эти 2 запроса, чтобы получить последнее обновление продукта и последнюю цену в одной строке
Не могли бы вы мне помочь?
Ответ №1:
Select first_query.last_update_date, second_query.latest_price -- or whatever name it is
from
(select a.item, a.last_update_date from products_table a inner join
(Select item, max(last_update_date) updates from products_table
group by item) b
on a.item=b.item --item is the product_id
and a.last_update_date=b.updates) first_query,
(select * from products_prices a
where item_code = ''--Product_id
and request_id = (select max(request_id) from products_prices b where a.item_code=b.item_code)) second_query
where
first_query.item = second_query.item_code;
Ответ №2:
Это было бы проще с помощью оконных функций:
select p.item, p.last_update_date, pp.*
from (select p.*,
row_number() over (partition by p.item order by p.last_update_date desc) as seqnum
from products_table p
) p join
(select pp.*,
row_number() over (partition by pp.item_code order by pp.request_id desc) as seqnum
from pp p
) pp
on pp.item_code = p.item
where p.seqnum = 1 and pp.seqnum = 1;