Amazon redshift 在红移中,Vertica的条件_true_事件是否有其他替代方案?

Amazon redshift 在红移中,Vertica的条件_true_事件是否有其他替代方案?,amazon-redshift,vertica,Amazon Redshift,Vertica,Vertica有一种非常好的操作类型:,基本上可以让您识别事件发生的时间。 例如,每当给定的布尔表达式解析为true时,条件_true_事件将增加一个计数器。 我们大量使用这种方法 我们正在考虑转移到红移,但我们需要一个类似的函数。 红移有一些不错的,但我找不到这个 是否有任何方法可以使用红移来模拟此函数?使用窗口函数编写条件\u TRUE\u事件相当容易。这只是一个有条件的计数: 变成: SELECT ts, symbol, bid, COUNT(CASE WHEN bid &g

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

我们正在考虑转移到红移,但我们需要一个类似的函数。 红移有一些不错的,但我找不到这个

是否有任何方法可以使用红移来模拟此函数?

使用窗口函数编写条件\u TRUE\u事件相当容易。这只是一个有条件的计数:

变成:

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 ;
条件_CHANGE_事件更复杂,因为它需要使用上一个值。可以使用滞后和求和、计数或行数来模拟它。但我认为它需要一个CTE、一个派生表或一个自连接:

SELECT ts, symbol, bid,
       CONDITIONAL_CHANGE_EVENT(bid)  
           OVER (ORDER BY ts) AS cce
FROM Tickstore3 
ORDER BY ts ;
将成为:

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 ;
我不知道这个有条件的事件函数在使用null时是如何工作的。如果checked for changes列中有空值,并且您希望查看是否有上一个非空值的更改,而不仅仅是上一个非空值的更改,那么重写将更加复杂


编辑:据我所知,在Redshift的文档中,当存在ORDER BY时,窗口聚合需要在无界的前一行和当前行之间有一个显式的窗口框架行。因此,在这些情况下,您可以/必须使用Vertica中的默认帧。要么在上面,要么在无界的前一行和当前行之间。

Wow!谢谢你非常详细的回答!很遗憾,我只能投一次票:
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 ;