mysql-从多个供应商处查找最新、最优惠的商品价格

ifsvaxew  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(374)

我现在很难找到解决问题的办法,你们是我最后的希望。两天以来我一直在努力解决这个难题:
表项:

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

供应商价格表:

-------------------------------------------------------
| 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 |
-------------------------------------------------------

有几件事需要注意:
不是每个供应商都有每件商品
一些供应商可能会比其他供应商更频繁地更新其价格,从而导致他们之间的时间戳差距更大
例如,我想知道哪个供应商目前以最好的价格出售香蕉?
我想我首先需要从每个供应商那里得到每件商品的最新价格,然后按价格排序,对吗?但如何以兼容mysql的方式做到这一点呢?
我认为第一部分的正确方法是:
从供应商价格中选择最大(时间戳)、供应商、项目、最小(价格),其中item=“banana”按供应商分组;
但是如何把它和其他标准联系起来呢?
编辑:由于我忘了问题中的一个重要部分,我不得不对第一个表格做一些修改,对不起:(
预期输出:第一个表(custa或custb)中特定客户的所有项目的所有供应商的最新最佳价格

pgpifvop

pgpifvop1#

您可以对条件使用嵌套的groupwise最大逻辑

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

演示

相关问题