DB2中计算的列引用

时间:2014-11-12 07:41:24

标签: sql db2

我有一个包含列的表: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) 为什么我不能参考计算列?还有其他办法吗?

1 个答案:

答案 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 ,因为它是所有订购的默认设置)

  • ASCLEAD(...)的功能相反,前方前一行。使用这两种函数,这种方式允许优化器只计算一个窗口(LAG(...)中指定的内容)。
  • 此处窗口函数的第三个参数是默认值 - 如果没有下一行/上一行,则从当前行返回OVER(...)
  • date1本质上是一个窗口函数分组,取代了原始查询中的PARTITION BY。 (一般来说,我发现这样的结构反映了命令式编程常见的心态,这往往与SQL的基于集合的性质背道而驰。通常有更好的方法来做事)。