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

基于条件计算tick_lower首个有效值tick_lower_position的SQL求解

问题与解决方案

现有数据表ticks

datetimelowest_ticktick_lower
2022-10-01 00:02:00204406204306
2022-10-01 00:03:00204525204425
2022-10-01 00:04:00204414204314
2022-10-01 00:05:00204200204100
2022-10-01 00:06:00204220204120
2022-10-01 00:07:00204120204020

需求说明

需要生成tick_lower_position字段:

  • 取值为满足tick_lower <= lowest_tick条件的首个tick_lower值
  • 后续行沿用该值,直到出现下一次满足条件的新值

期望结果表

datetimelowest_ticktick_lowertick_lower_position
2022-10-01 00:02:00204406204306204306
2022-10-01 00:03:00204525204425204306
2022-10-01 00:04:00204487204387204306
2022-10-01 00:05:00204200204100204100
2022-10-01 00:06:00204220204120204100
2022-10-01 00:07:00204120204020204100

原方案问题分析

你尝试的基于lag()的分组方案逻辑不符合当前需求,错误触发了分组条件,导致第三行的tick_lower_position取值错误。

正确解决方案

核心思路:

  1. 标记所有满足tick_lower <= lowest_tick的行作为"锚点"
  2. 基于锚点分组,让锚点后的所有行归属到最近的上一个锚点分组
  3. 在每个分组内取锚点的tick_lower值作为全组的tick_lower_position

对应的SQL语句:

SELECT 
  t.*,
  FIRST_VALUE(tick_lower) OVER (PARTITION BY group_id ORDER BY datetime) AS tick_lower_position
FROM (
  SELECT 
    *,
    SUM(CASE WHEN tick_lower <= lowest_tick THEN 1 ELSE 0 END) OVER (ORDER BY datetime) AS group_id
  FROM ticks
) t
ORDER BY datetime;

逻辑解释

  • 内层子查询通过SUM(CASE...) OVER(ORDER BY datetime)生成group_id:每遇到一个满足条件的锚点行,分组ID递增,后续不满足条件的行继承当前分组ID,直到下一个锚点出现。
  • 外层通过FIRST_VALUE(tick_lower)在每个分组内取首个锚点的tick_lower值,作为该组所有行的tick_lower_position。

内容的提问来源于stack exchange,提问作者Ivan Roptanov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:20:51