我有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