如何编写SQL查询实现shop表product去重并关联最新交付日期?
shop表product去重并关联对应最新交付日期的SQL实现方案
以下实现默认shop表包含product(商品唯一标识)、delivery_date(交付日期)两个核心字段,可根据实际表结构调整字段名。
核心实现逻辑围绕「按product维度聚合取最大交付日期」展开,根据需要返回的字段范围可选择以下不同写法:
场景1:仅需返回product、对应最新交付日期两个字段
直接使用分组聚合即可,写法最简单:
SELECT product, MAX(delivery_date) AS latest_delivery_date FROM shop GROUP BY product;
- 优点:语法兼容性强,所有SQL版本都支持,执行效率最高
- 适用场景:不需要拉取该交付记录的其他附属字段(如订单号、交付数量、收货信息等)
场景2:需要返回最新交付记录的全量附属字段
如果需要带出该条最新交付对应的其他表字段,无法直接用普通分组实现,可按数据库版本选择以下两种写法:
写法1:窗口函数(适用于MySQL8.0+、PostgreSQL、SQL Server、Oracle等支持窗口函数的数据库)
先对每个product的交付记录按日期倒序排名,再筛选排名为1的记录即可:
WITH shop_rank AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY product ORDER BY delivery_date DESC) AS rn FROM shop ) SELECT * FROM shop_rank WHERE rn = 1;
- 可替换逻辑:如果同一个product存在多条同日期的最新交付记录,且需要全部保留,可将
ROW_NUMBER()替换为RANK()
写法2:关联子查询(适用于所有SQL版本,包括MySQL5.x等不支持窗口函数的老旧版本)
先计算每个product的最新交付日期,再用原表和这个结果集做等值关联匹配:
SELECT s.* FROM shop s INNER JOIN ( SELECT product, MAX(delivery_date) AS latest_delivery_date FROM shop GROUP BY product ) latest ON s.product = latest.product AND s.delivery_date = latest.latest_delivery_date;
- 注意事项:如果存在同product同最新交付日期的多条重复记录,该写法会返回全部匹配行,如需仅保留一条,可在最外层查询搭配主键筛选或加
DISTINCT关键字
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

