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

子查询别名列应用CASE及WHERE过滤别名列的SQL问题求解

报错原因

你遇到的别名不存在报错是SQL执行顺序的固有特性导致的:SELECT 子句的执行优先级低于 WHERE、分组、排序前置计算逻辑,所以你在SELECT中自定义的别名(difference_previous_level、Regenzähler等)无法直接在同查询层的过滤、其他计算规则中调用,需要先通过子查询或CTE提前计算生成别名列后,再做后续逻辑处理。

实现代码

WITH calc_data AS (
    -- 第一步:先完成基础计算,生成所有自定义别名列
    SELECT 
        time_time,
        col_2 AS Regenzähler,
        LAG(col_2) OVER (ORDER BY time_time) AS previous_level,
        col_2 - LAG(col_2) OVER (ORDER BY time_time) AS difference_previous_level
    FROM raindata
    -- 如需保留原逻辑的去重能力,可在SELECT后加DISTINCT
),
rank_data AS (
    -- 第二步:按time_time分组,给同时间的行做优先级排序:差值非0的行优先级更高
    SELECT 
        *,
        ROW_NUMBER() OVER (
            PARTITION BY time_time 
            ORDER BY CASE WHEN difference_previous_level = 0 THEN 2 ELSE 1 END
        ) AS row_rank
    FROM calc_data
)
-- 第三步:过滤+实现CASE逻辑
SELECT 
    time_time,
    Regenzähler,
    previous_level,
    difference_previous_level,
    CASE WHEN difference_previous_level <> 0 THEN Regenzähler END AS target_regenzahler
FROM rank_data
WHERE row_rank = 1
ORDER BY time_time, difference_previous_level;

逻辑说明

  • 同时间下存在非0差值的行时,会自动过滤掉差值为0的行,仅保留非0行;如果同时间所有行差值均为0,会保留其中1行,符合你需求1的过滤规则
  • 最终输出的target_regenzahler列就是需求2要求的逻辑:差值不为0时返回对应的Regenzähler值,差值为0时返回NULL,你也可以根据需要补充ELSE分支设置其他默认值
  • 如果同时间下存在多个差值非0的行,可将ROW_NUMBER替换为RANK,即可保留所有非0差值的行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:36:00