我有一个包含列的表:date1,name和price。我想要做的是添加两列,一列具有相同名称的连续日期的最小和最大日期。
我编写了以下查询解释规则:
select date1,name,price
case
when lag(name,1) over(order by date1 ASC,name ASC)=name then lag(minDate,1) over(order by date1 ASC,name ASC)
else date1
end as minDate,
case
when lag(name,1) over(order by date1 DESC,name DESC)=name then lag(maxDate,1) over(order by date1 DESC,name DESC)
else date1
end as maxDate
from MyTable order by date1 ASC,name ASC
我的问题是我得到了“minDate / maxDate的无效上下文”(SQLCODE = -206,SQLSTATE = 42703) 为什么我不能参考计算列?还有其他办法吗?
答案 0 :(得分:1)
它抱怨lag(maxDate,1)
,因为maxDate
未在该范围内定义;它不是MyTable
中的列,并且在 {/ 1}}列表中的之后,别名才可用(通过将其推入子查询,或者像SELECT
)这样的子句。
顺便提一下,您的查询可以更好地编写如下:
HAVING
(我已经遗漏了SELECT date1, name, price,
LAG(date1, 1, date1) OVER(PARTITION BY name ORDER BY date1) AS minDate,
LEAD(date1, 1, date1) OVER(PARTITION BY name ORDER BY date1) AS maxDate
FROM MyTable
ORDER BY date1, name
,因为它是所有订购的默认设置)
ASC
与LEAD(...)
的功能相反,前方前一行。使用这两种函数,这种方式允许优化器只计算一个窗口(LAG(...)
中指定的内容)。 OVER(...)
。 date1
本质上是一个窗口函数分组,取代了原始查询中的PARTITION BY
。 (一般来说,我发现这样的结构反映了命令式编程常见的心态,这往往与SQL的基于集合的性质背道而驰。通常有更好的方法来做事)。