我目前无法为我的问题找到解决方案,而你们是我的最后希望。两天以来,我一直在努力解决这个难题:
表项:
----------------------------
| 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 |
-------------------------------------------------------
有几件事要注意:
例如,我想知道哪个供应商以最优惠的价格出售香蕉?
我认为我首先需要从每个供应商处获取每件商品的最新价格,然后按价格对价格进行排序,对吗?但是如何以与MySQL兼容的方式做到这一点呢?
我认为第一部分的正确方法是:
从vendor_prices中选择MAX(时间戳),供应商,项目,MIN(价格),其中item =“ banana” GROUP BY供应商;
但是如何将其与所有其他条件联系起来?
编辑:由于我忘记了问题中的重要部分,对不起,我不得不稍微更改第一个表:(
预期产量:第一张表(custA或custB)中特定客户的所有商品的所有供应商的最新,最优惠价格
答案 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'
如果您使用的是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中可用的window function和common 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