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
运行后输出和预期结果完全一致:
| Name | DetailedName | Value |
|---|---|---|
| A1 | A1eng | 5 |
| B1 | B1eng | 13 |
内容的提问来源于stack exchange,提问作者Pranav Arora
相关产品推荐
相关产品推荐

