MySQL - найдите самую последнюю лучшую цену на товар от нескольких поставщиков - PullRequest
0 голосов
/ 28 июня 2018

У меня сейчас проблемы с поиском решения моей проблемы, а вы, ребята, моя последняя надежда. Уже два дня я пытаюсь решить эту загадку:

элемент таблицы:

----------------------------
| id   | item   | customer |
----------------------------
| 1    | banana | custA    |
----------------------------
| 2    | apple  | custA    |
----------------------------
| 3    | orange | custB    |
----------------------------
| 4    | apple  | custB    |
----------------------------

таблица vendor_prices:

-------------------------------------------------------
| id  |   item    |   price   |   vendor |  timestamp |
-------------------------------------------------------
| 1   |  banana   |   0.23    | VendorA  |  564645564 |
-------------------------------------------------------
| 2   |  orange   |   0.21    | VendorA  |  564645564 |
-------------------------------------------------------
| 3   |  apple    |   0.19    | VendorB  |  564645564 |
-------------------------------------------------------
| 4   |  banana   |   0.22    | VendorB  |  564645565 |
-------------------------------------------------------
| 5   |  banana   |   0.21    | VendorB  |  564645567 |
-------------------------------------------------------

Есть несколько вещей, на которые стоит обратить внимание:

  1. Не у каждого продавца есть каждый предмет
  2. Некоторые поставщики могут обновлять свои цены чаще, чем другие, что приводит к увеличению разрыва между ними в отметке времени

Например, я хочу знать, какой продавец продает бананы в настоящее время по лучшей цене?

Я думаю, что сначала мне нужно будет получить самую последнюю цену от каждого поставщика для каждого товара, а затем отсортировать их по цене, верно? Но как сделать это совместимым с MySQL способом?

Я думаю, что правильный путь для первой части:

ВЫБРАТЬ МАКС (отметка времени), поставщик, элемент, МИН. (Цена) ОТ vendor_prices ГДЕ item = "banana" GROUP BY vendor;

Но как связать это со всеми другими критериями?

РЕДАКТИРОВАТЬ: мне пришлось немного изменить первую таблицу, так как я забыл важную часть в вопросе, извините: (

Ожидаемый результат: самая последняя и лучшая цена всех поставщиков для всех товаров для конкретного клиента в первой таблице (custA или custB)

1 Ответ

0 голосов
/ 28 июня 2018

Вы можете использовать вложенную групповую максимальную логику для ваших критериев

select a.*
from vendor_prices a
join (
  select item, min(price) price, max(timestamp) timestamp
  from (
    select d.*
    from vendor_prices d
    join (
      select item, vendor, max(timestamp) timestamp
      from vendor_prices
      group by item, vendor
    ) e using(item, vendor,timestamp )
  ) c
  group by item
) b using (item,price, timestamp)
where a.item = 'banana'

Демо

Если вы используете Mysql 8+, вы можете воспользоваться оконными функциями

Редактировать * получить все товары для клиента (лучшая цена и продавец для каждого товара) *

select  i.*,a.*
from vendor_prices a
join (
  select  item, min(price) price, max(timestamp) timestamp
  from (
    select  d.*
    from vendor_prices d
    join (
      select  item, vendor, max(timestamp) timestamp
      from vendor_prices
      group by item, vendor
    ) e using(item, vendor,timestamp )
  ) c
  group by item
) b using (item,price,timestamp )
join item i using(item)
where i.customer = 'custA'
order by i.item

Демо

Используя оконную функцию и общее табличное выражение , доступные в Mysql 8, вы можете использовать следующие

with latest_price as(
    select *, 
    dense_rank() over (partition by item order by timestamp desc, price asc ) rnk
    from vendor_prices
    order by  item, rnk
)

select i.id itemid, i.customer,a.* 
from latest_price a
join item i using(item)
where i.customer = 'custA'
and a.rnk = 1

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...