You need to enable JavaScript to run this app. 如何编写SQL查询实现shop表product去重并关联最新交付日期?
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.29 11:45:05