получение максимальных данных при множественном соединении - PullRequest
0 голосов
/ 14 июля 2020

у меня есть такие данные

Purchase_order (po)

po_id   pi_id    store
112     789      ABC
113     101      DEF
114     102      GHI
115     103      JKL

Purchase_items (pi)

pi_id  barcode   price    date
789    123       500      2020-06-04
101    123       400      2020-06-03
102    456       500      2020-06-02
103    456       400      2020-06-01

product

barcode   product
123       milk
456       tea

Я хочу получить последнюю цену за каждый штрих-код, если магазин исключает "GHI"

ожидаемый результат

barcode  price
123      500
456      400

как мне сделать?

Ответы [ 4 ]

1 голос
/ 14 июля 2020

row_number() - это один метод:

select pi.barcode, pi.price
from (select pi.*, row_number() over (partition by pi.barcode order by pi.date desc) as seqnum
      from purchase_items pi
      where not exists (select 1
                        from purchase_orders po 
                        where po.pi_id = pi.pi_id and po.store = 'GHI'
                       )
     ) pi
where seqnum = 1;
1 голос
/ 14 июля 2020

Один вариант использует коррелированный подзапрос:

select
    p.barcode,
    (
        select pi.price
        from purchase_items pi
        inner join purchase_orders po on po.pi_id = pi.pi_id
        where pi.barcode = p.barcode and po.store <> 'GHI'
        order by pi.date desc limit 1
    ) price
from product p
0 голосов
/ 14 июля 2020

Способ использования подзапросов.

SELECT 
    DISTINCT
    a.`barcode`,
    a.`price` 
FROM
    purchase_items a 
WHERE a.`date` = 
    (SELECT 
        MAX(`date`) 
    FROM
        purchase_items i 
    WHERE i.barcode = a.barcode 
        AND 'GHI' != 
        (SELECT 
            store 
        FROM
            purchase_order 
        WHERE pi_id = i.`pi_id` 
        LIMIT 1)) ;
0 голосов
/ 14 июля 2020

Использовать соединение с max-функцией:

select pi.barcode, max(pi.price)
from purchase_items pi
  join purchase_order po on po.pi_id=pi.pi_id
where po.store!='GHI'
group by pi.barcode
...