在RedShift中有没有替代Vertica的conditional_true_event?

JSB*_*ach 3 vertica amazon-redshift

Vertica有一个非常好的操作类型:基于事件的窗口操作,它基本上可以让您识别事件发生的时间.例如,每当给定的布尔表达式解析为true时,conditional_true_event将递增计数器.我们大量使用这种方法.

我们正在考虑迁移到RedShift,但我们需要一个类似的功能.RedShift有一些不错的窗口功能,但我找不到这个.

有没有办法可以使用RedShift模拟这个功能?

ype*_*eᵀᴹ 6

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).