gpt4 book ai didi

amazon-redshift - 在 RedShift 中,Vertica 的 conditional_true_event 有什么替代方法吗?

转载 作者:行者123 更新时间:2023-12-04 06:59:19 29 4
gpt4 key购买 nike

Vertica 有一种非常好的操作类型:Event-Based Window operations ,这基本上可以让您识别事件何时发生。
例如,每次给定的 bool 表达式解析为真时,conditional_true_event 将增加一个计数器。
我们大量使用这种方法。

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

有什么办法可以使用 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 ;

变成:
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 ;
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 ;

会变成:
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 ;

我不知道这是怎么回事 CONDITIONAL_CHANGE_EVENT()函数的行为与空值。如果有 NULL检查更改列中的值 - 并且您想查看最后一个非空值是否有更改,而不仅仅是前一个值 - 重写将更加复杂。

编辑:据我了解 Redshift 的文档,当存在 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 时,窗口聚合需要一个显式的窗口框架( ORDER BY )。 .因此,您可以/必须使用它(或者在这些情况下 Vertica 中的任何默认框架。它要么是上面的,要么是 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW )。

关于amazon-redshift - 在 RedShift 中,Vertica 的 conditional_true_event 有什么替代方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35606673/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com