如何在同一张表中查询指定数据的正向金额变化前后记录?
解决方案:找到Name为A的金额正向变化关键记录
当然可行!你的需求是定位Name为A的金额从阶段性最低值到后续新高值的两个核心记录,现有代码的逻辑偏了——它是基于ID连续的相邻记录对比,没法实现按日期分组找极值的目标。咱们来调整逻辑,实现你要的效果:
问题分析
你需要的核心逻辑拆解:
- 筛选出所有Name为A的记录
- 按日期分组,找出每个日期的金额极值
- 定位金额最低的那个日期的最小金额记录
- 找到该日期之后,金额最大值首次超过这个最低值的日期的最大金额记录
- 提取这两个关键的原始行
完整SQL代码
WITH daily_stats AS ( -- 第一步:按日期分组,计算Name为A的每日金额极值 SELECT Name, Date, MIN(Amount) AS min_amount, MAX(Amount) AS max_amount FROM tableA WHERE Name = 'A' GROUP BY Name, Date ORDER BY Date ), lowest_point AS ( -- 第二步:找到金额最低的那条统计记录 SELECT * FROM daily_stats WHERE min_amount = (SELECT MIN(min_amount) FROM daily_stats) ), next_high_point AS ( -- 第三步:找到最低日期之后,金额最大值最高的那条统计记录(即新高点) SELECT * FROM daily_stats WHERE Date > (SELECT Date FROM lowest_point) AND max_amount > (SELECT min_amount FROM lowest_point) ORDER BY max_amount DESC LIMIT 1 ) -- 第四步:关联原始表,提取对应的完整记录 SELECT t.* FROM tableA t JOIN ( SELECT Date, min_amount AS target_amount FROM lowest_point UNION ALL SELECT Date, max_amount AS target_amount FROM next_high_point ) AS key_points ON t.Name = 'A' AND t.Date = key_points.Date AND t.Amount = key_points.target_amount;
代码说明
daily_statsCTE:先按日期聚合,拿到每个日期的最小和最大金额,为后续定位关键节点做准备lowest_point:筛选出所有Name为A的记录中金额最小的那条统计数据next_high_point:在最低日期之后,找到金额最大值超过最低值的记录,取最大的那个(也就是你要的新高点)- 最后通过关联原始表,把这两个关键节点对应的原始行完整提取出来
结果验证
运行这段SQL后,会得到你需要的两行记录:
ID Name Amount Date 5 A 10 08/04/2018 9 A 100 08/07/2018
现有代码的问题
你的原代码用cur.id = pre.id + 1做自连接,存在两个明显问题:
- 依赖ID连续的假设,但实际业务中ID可能因为删除、插入顺序等原因不连续
- 只能对比相邻ID的记录,无法按日期维度找出阶段性的极值和后续的新高变化,完全不符合你的需求
内容的提问来源于stack exchange,提问作者Crazymango
相关产品推荐
相关产品推荐

