接着上一篇 精读《15 大 LOD 表达式 - 上》 ,这次继续总结 Top 15 LOD Expressions 这篇文章的 9~15 场景。
9. 某时间段内最后一天的值
如何实现股票平均每日收盘价与当月最后一天收盘价的对比趋势图?
如图所示,要对比的并非是某个时间段,而是当月最后一天的收盘价,因此必须要借助 LOD 表达式。
设想原表如下:
Date | Ticker | Adj Close |
---|---|---|
29/08/2013 | SYMC | $1 |
28/08/2013 | SYMC | $2 |
27/08/2013 | SYMC | $3 |
我们按照月进行聚合作为横轴,求 avg([Adj Close])
作为纵轴即可。但计算对比我们需要一个 Max Date 字段如下:
Date | Ticker | Adj Close | Max, Date |
---|---|---|---|
29/08/2013 | SYMC | $1 | 29/08/2013 |
28/08/2013 | SYMC | $2 | 29/08/2013 |
27/08/2013 | SYMC | $3 | 29/08/2013 |
如果我们使用 max(Date)
表达式,在聚合后结果是可以看到 Max Date 的:
Month of Date | Ticker | Avg, Adj Close | Max, Date |
---|---|---|---|
08/2013 | SYMC | $2 | 29/08/2013 |
原因是,max(Date)
是一个聚合表达式,只能在 group by 聚合 sql 下生效。但如果我们要计算最后一天的收盘价,就要执行 sum([Close value on last day]
,表达式如下:
[Close value on last day] = if [Max Date] = [Date] then [Adj Close] else 0 end
。
但问题是,这个表达式计算的明细级别是以天为粒度的,我们 max(Date)
在天粒度下是算不出来的:
Date | Ticker | Adj Close | Max, Date |
---|---|---|---|
29/08/2013 | SYMC | $1 | |
28/08/2013 | SYMC | $2 | < |