将FIRST_VALUE与基于另一列的条件一起使用



我有Snowflake作为我们的数据仓库,但我的问题与任何支持FIRST_VALUE、LAST_VALUE、LEAD、LAG等窗口函数的SQL方言有关。

我有一张桌子如下。样品台

我想要创建另一个列,比如PreferredCurrencyCurrent,它基本上应该是来自EventName=AccountCreated或AccountUpdatedEvent2

所以,结果应该是这样的

期望结果

我尝试过使用窗口函数FIRST_VALUE、LEAD/LAG,但在检查EventName的附加条件下,我没有成功。

我认为ANSI标准的方式应该是

FIRST_VALUE(PreferredCurrency) 
FILTER(WHERE EventName IN ('AccountCreated', 'AccountUpdatedEvent2')) 
OVER(PARTITION BY AccountID ORDER BY EventCreated DESC)

然而,我还不知道有哪个DBMS能真正做到这一点。我认为Postgres可能是最接近的,但FILTER子句还没有实现用于非聚合窗口函数。目前,我认为您将不得不使用一个共同相关的子查询:

SELECT *, 
(   SELECT PreferredCurrency 
FROM    T AS T2 
WHERE   T2.AccountID = T.AccountID 
AND     T2.EventName IN ('AccountCreated', 'AccountUpdatedEvent2') 
AND     T2.EventCreated <= T.EventCreated 
ORDER BY T2.EventCreated DESC 
FETCH FIRST 1 ROWS ONLY -- or your DBMS Equivalent
) AS PreferredCurrencyCurrent
FROM    T
ORDER BY AccountKey DESC;

数据库示例<gt;Fiddle

最新更新