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

如何在同一张表中查询指定数据的正向金额变化前后记录?

解决方案:找到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_stats CTE:先按日期聚合,拿到每个日期的最小和最大金额,为后续定位关键节点做准备
  • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:57:08