You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改SQL查询使每个id仅返回对应最新日期的一条销售记录

问题原因

原SQL在GROUP BY子句中同时绑定了id和sales_amount字段,当同一id在指定日期范围内存在多笔sales_amount不同的销售记录时,会按id+sales_amount的组合拆分分组,每个分组都会返回一行结果,因此会出现同一id返回多条记录的问题。

解决方案

方案1:窗口函数实现(适配MySQL8.0+、PostgreSQL、SQL Server等所有支持窗口函数的主流数据库)

该方案兼容性强,逻辑清晰,是最推荐的实现方式:

SELECT id, date, sales_amount
FROM (
    SELECT 
        id,
        date,
        sales_amount,
        -- 按id分组,日期倒序排序,最新记录排名为1
        ROW_NUMBER() OVER (PARTITION BY id ORDER BY date DESC) AS rn
    FROM customer
    WHERE date BETWEEN '2020-08-01' AND '2020-08-15'
      -- 若需要查询所有客户的最新记录,可删除下一行id过滤条件
      AND id = 1001
) temp
WHERE rn = 1;

说明:如果同一id的最大日期存在多条记录,上述写法会随机返回一条;如果需要返回该日期下的所有记录,可将ROW_NUMBER()替换为RANK()。

方案2:子查询关联实现(适配不支持窗口函数的低版本数据库,如MySQL5.x)

通过子查询先查出每个id的最大日期,再关联原表匹配对应销售金额:

SELECT c.id, c.date, c.sales_amount
FROM customer c
INNER JOIN (
    SELECT id, MAX(date) AS max_date
    FROM customer
    WHERE date BETWEEN '2020-08-01' AND '2020-08-15'
      AND id = 1001
    GROUP BY id
) t ON c.id = t.id AND c.date = t.max_date
WHERE c.date BETWEEN '2020-08-01' AND '2020-08-15'
  AND c.id = 1001
-- 若同一最大日期存在多条记录且只需要返回一条,可取消下一行注释
-- LIMIT 1;

内容的提问来源于stack exchange,提问作者Hammad Saleem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:06:04