如何获取每个商品最短配送时间对应的ArticleID与SupplierID?
获取每个商品最短配送时间对应供应商的解决方案
下面提供几种实用的SQL写法,解决你无法直接关联SupplierID的问题:
方法一:子查询关联(兼容多数数据库)
先通过子查询算出每个商品的最短配送时间,再和原表关联匹配,就能拿到对应的供应商ID:
SELECT p.ArticleID, p.SupplierID, p.DeliveryTime FROM Procurement p INNER JOIN ( SELECT ArticleID, MIN(DeliveryTime) AS MinDeliveryTime FROM Procurement GROUP BY ArticleID ) t ON p.ArticleID = t.ArticleID AND p.DeliveryTime = t.MinDeliveryTime;
如果多个供应商给同一商品的配送时间都是最短的,这个写法会返回所有符合条件的供应商记录。
方法二:窗口函数(适合支持SQL:2003及以上的数据库,如MySQL8+、PostgreSQL、SQL Server等)
用ROW_NUMBER()或RANK()窗口函数,按商品分组后按配送时间排序,取排序第一的记录:
用ROW_NUMBER()(仅返回一条最短记录,若有多个同最短时间的供应商,随机选一个)
SELECT ArticleID, SupplierID, DeliveryTime FROM ( SELECT ArticleID, SupplierID, DeliveryTime, ROW_NUMBER() OVER (PARTITION BY ArticleID ORDER BY DeliveryTime ASC) AS rn FROM Procurement ) t WHERE rn = 1;
用RANK()(返回所有配送时间最短的供应商记录)
SELECT ArticleID, SupplierID, DeliveryTime FROM ( SELECT ArticleID, SupplierID, DeliveryTime, RANK() OVER (PARTITION BY ArticleID ORDER BY DeliveryTime ASC) AS rn FROM Procurement ) t WHERE rn = 1;
窗口函数写法更简洁,执行效率也通常更优,推荐在支持的数据库中使用。
内容的提问来源于stack exchange,提问作者GrayFox
相关产品推荐
相关产品推荐

