MySQL-查找多家供应商的产品的最新,最优惠的价格

时间:2018-06-28 18:55:47

标签: mysql join groupwise-maximum

我目前无法为我的问题找到解决方案,而你们是我的最后希望。两天以来,我一直在努力解决这个难题:

表项:

----------------------------
| 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中选择MAX(时间戳),供应商,项目,MIN(价格),其中item =“ banana” GROUP BY供应商;

但是如何将其与所有其他条件联系起来?

编辑:由于我忘记了问题中的重要部分,对不起,我不得不稍微更改第一个表:(

预期产量:第一张表(custA或custB)中特定客户的所有商品的所有供应商的最新,最优惠价格

1 个答案:

答案 0 :(得分:1)

您可以将嵌套groupwise maximum logic用于您的条件

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'

Demo

如果您使用的是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

Demo

使用Mysql 8中可用的window functioncommon table expression,您可以使用以下

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

Demo