子查询别名列应用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
相关产品推荐
相关产品推荐

