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

SQL如何基于字符串列的指定区间范围对数值列分组求和

问题原因

你原有代码存在3个核心错误,导致无法得到正确结果:

  • BETWEEN语法使用错误:BETWEEN后需要传入两个和筛选列同类型的边界值,你传入的是trim(Position_name ) = REGEXP_EXTRACT(...)这类布尔判断表达式,返回值只有TRUE/FALSE,完全无法作为区间边界匹配数据。
  • 区间判断逻辑错误:你尝试直接对Position_name字符串做BETWEEN匹配,一方面字符串字典序和你实际需要的按Position_Seqnum排序的业务顺序不一致,另一方面Position_name里的描述文本存在空格差异(比如B1的起始位是00- Start here比A1多了一个空格),直接匹配字符串很容易漏数。
  • 语法结构错误:CTE没有声明、括号不匹配、WHERE子句开头多余AND关键字、没有写SUM聚合逻辑,代码本身就无法正常运行。
正确实现方案

核心逻辑是先按Name、DetailedName分组,找到每组里"Start here"和"Stop there"对应的Position_Seqnum作为区间的上下边界,再筛选组内序号在边界范围内的行做求和,完全规避字符串匹配的各种异常问题。

WITH group_boundary AS (
  SELECT
    Name,
    DetailedName,
    -- 取组内Start here对应的序号作为起点
    MIN(CASE WHEN TRIM(Position_name) LIKE '%Start here%' THEN Position_Seqnum END) AS start_seq,
    -- 取组内Stop there对应的序号作为终点
    MIN(CASE WHEN TRIM(Position_name) LIKE '%Stop there%' THEN Position_Seqnum END) AS end_seq
  FROM `table`
  GROUP BY Name, DetailedName
)
SELECT
  t.Name,
  t.DetailedName,
  SUM(t.Value) AS Value
FROM `table` t
INNER JOIN group_boundary b
  ON t.Name = b.Name
  AND t.DetailedName = b.DetailedName
-- 用数字序号做区间判断,稳定无格式问题
WHERE t.Position_Seqnum BETWEEN b.start_seq AND b.end_seq
  AND t.Value > 0
GROUP BY t.Name, t.DetailedName
ORDER BY t.Name

运行后输出和预期结果完全一致:

NameDetailedNameValue
A1A1eng5
B1B1eng13

内容的提问来源于stack exchange,提问作者Pranav Arora

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:39:15