JSB*_*ach 3 vertica amazon-redshift
Vertica有一个非常好的操作类型:基于事件的窗口操作,它基本上可以让您识别事件发生的时间.例如,每当给定的布尔表达式解析为true时,conditional_true_event将递增计数器.我们大量使用这种方法.
我们正在考虑迁移到RedShift,但我们需要一个类似的功能.RedShift有一些不错的窗口功能,但我找不到这个.
有没有办法可以使用RedShift模拟这个功能?
该CONDITIONAL_TRUE_EVENT()是相当容易的窗函数来写.它只是一个COUNT条件(CASE):
SELECT ts, symbol, bid,
CONDITIONAL_TRUE_EVENT(bid > 10.6)
OVER (ORDER BY ts) AS oce
FROM Tickstore3
ORDER BY ts ;
Run Code Online (Sandbox Code Playgroud)
变为:
SELECT ts, symbol, bid,
COUNT(CASE WHEN bid > 10.6 THEN 1 END)
OVER (ORDER BY ts
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
AS oce
FROM Tickstore3
ORDER BY ts ;
Run Code Online (Sandbox Code Playgroud)
的CONDITIONAL_CHANGE_EVENT(),因为它需要使用以前的价值是比较复杂的.它可以使用LAG()和SUM()或COUNT()(或ROW_NUMBER())来模拟.但它需要我认为CTE或派生表(或自联接):
SELECT ts, symbol, bid,
CONDITIONAL_CHANGE_EVENT(bid)
OVER (ORDER BY ts) AS cce
FROM Tickstore3
ORDER BY ts ;
Run Code Online (Sandbox Code Playgroud)
会变成:
WITH emu AS
( SELECT ts, symbol, bid,
CASE WHEN bid <> LAG(bid) OVER (ORDER BY ts)
THEN 1
END AS change_bid
FROM Tickstore3
)
SELECT ts, symbol, bid,
COUNT(change_bid)
OVER (ORDER BY ts
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
AS cce
FROM emu
ORDER BY ts ;
Run Code Online (Sandbox Code Playgroud)
我不知道这个CONDITIONAL_CHANGE_EVENT()函数如何使用null.如果NULL在checked for changes列中有值 - 并且您想要查看是否有上一个非空值而不仅仅是前一个值的更改 - 则重写将更加复杂.
编辑:据我了解Redshift的文档,ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW当有一个窗口聚合时,窗口聚合需要一个显式的窗口框架()ORDER BY.因此,您可以/必须使用它(或者在这些情况下,无论Vertica中的默认帧是什么.它可以是上面的,也可以是RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW).
| 归档时间: |
|
| 查看次数: |
745 次 |
| 最近记录: |