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

Oracle SQL:按分组筛选指定Stop_number区间内的行

解决Oracle SQL的ORA-01427错误并实现分组筛选需求

错误原因

你遇到的ORA-01427: single-row subquery returns more than one row错误,是因为原SQL中的子查询没有按Groups分组过滤,导致返回了所有分组中Stop_number=20231和Stop_number=21567的多条Sort_Sequence值,而>=/<=运算符要求子查询只能返回单行结果,因此触发错误。

正确查询写法

根据你的需求(按Groups分组,筛选每个组内Sort_Sequence介于该组Stop_number=20231和Stop_number=21567对应值之间的行),提供两种可靠写法:

写法1:使用CTE+分组聚合(推荐,性能更优)

先预计算每个分组的Sort_Sequence边界,再关联原表筛选:

WITH group_sort_bounds AS (
    SELECT 
        Groups,
        -- 取该组Stop_number=20231对应的Sort_Sequence(若有多条取最大值,可根据需求换MIN)
        MAX(CASE WHEN Stop_number = 20231 THEN Sort_Sequence END) AS lower_bound,
        -- 取该组Stop_number=21567对应的Sort_Sequence(若有多条取最小值,可根据需求换MAX)
        MAX(CASE WHEN Stop_number = 21567 THEN Sort_Sequence END) AS upper_bound
    FROM your_table  -- 替换为你的实际表名
    GROUP BY Groups
)
SELECT t.Groups, t.Sort_Sequence, t.Stop_number
FROM your_table t
JOIN group_sort_bounds gb ON t.Groups = gb.Groups
WHERE t.Sort_Sequence BETWEEN gb.lower_bound AND gb.upper_bound;

写法2:使用关联子查询(适合简单场景)

针对每行的Groups,动态查询对应分组的边界值:

SELECT Groups, Sort_Sequence, Stop_number
FROM your_table t  -- 替换为你的实际表名
WHERE Sort_Sequence >= (
    SELECT MAX(Sort_Sequence)
    FROM your_table
    WHERE Groups = t.Groups AND Stop_number = 20231
)
AND Sort_Sequence <= (
    SELECT MIN(Sort_Sequence)
    FROM your_table
    WHERE Groups = t.Groups AND Stop_number = 21567
);

注意事项

  • 若每个分组中Stop_number=20231或21567存在多条记录,需根据业务逻辑选择MAX()或MIN()来确定边界值;
  • 若你的需求只是直接筛选所有分组中Stop_number在20231到21567之间的行,可简化为:
    SELECT Groups, Sort_Sequence, Stop_number
    FROM your_table
    WHERE Stop_number BETWEEN 20231 AND 21567;
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 08:55:13