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

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

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

  1. ----------------------------
  2. | id | item | customer |
  3. ----------------------------
  4. | 1 | banana | custA |
  5. ----------------------------
  6. | 2 | apple | custA |
  7. ----------------------------
  8. | 3 | orange | custB |
  9. ----------------------------
  10. | 4 | apple | custB |
  11. ----------------------------

供应商价格表:

  1. -------------------------------------------------------
  2. | id | item | price | vendor | timestamp |
  3. -------------------------------------------------------
  4. | 1 | banana | 0.23 | VendorA | 564645564 |
  5. -------------------------------------------------------
  6. | 2 | orange | 0.21 | VendorA | 564645564 |
  7. -------------------------------------------------------
  8. | 3 | apple | 0.19 | VendorB | 564645564 |
  9. -------------------------------------------------------
  10. | 4 | banana | 0.22 | VendorB | 564645565 |
  11. -------------------------------------------------------
  12. | 5 | banana | 0.21 | VendorB | 564645567 |
  13. -------------------------------------------------------

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

pgpifvop

pgpifvop1#

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

  1. select a.*
  2. from vendor_prices a
  3. join (
  4. select item, min(price) price, max(timestamp) timestamp
  5. from (
  6. select d.*
  7. from vendor_prices d
  8. join (
  9. select item, vendor, max(timestamp) timestamp
  10. from vendor_prices
  11. group by item, vendor
  12. ) e using(item, vendor,timestamp )
  13. ) c
  14. group by item
  15. ) b using (item,price, timestamp)
  16. where a.item = 'banana'

演示
如果您使用的是mysql 8+,那么使用窗口函数可以从中获益
编辑获取客户的所有项目(每个项目的最佳价格和供应商)

  1. select i.*,a.*
  2. from vendor_prices a
  3. join (
  4. select item, min(price) price, max(timestamp) timestamp
  5. from (
  6. select d.*
  7. from vendor_prices d
  8. join (
  9. select item, vendor, max(timestamp) timestamp
  10. from vendor_prices
  11. group by item, vendor
  12. ) e using(item, vendor,timestamp )
  13. ) c
  14. group by item
  15. ) b using (item,price,timestamp )
  16. join item i using(item)
  17. where i.customer = 'custA'
  18. order by i.item

演示
使用mysql 8中提供的窗口函数和公共表表达式,您可以使用

  1. with latest_price as(
  2. select *,
  3. dense_rank() over (partition by item order by timestamp desc, price asc ) rnk
  4. from vendor_prices
  5. order by item, rnk
  6. )
  7. select i.id itemid, i.customer,a.*
  8. from latest_price a
  9. join item i using(item)
  10. where i.customer = 'custA'
  11. and a.rnk = 1

演示

展开查看全部

相关问题