Tsql 使用第一个_值,条件基于另一列

Tsql 使用第一个_值,条件基于另一列,tsql,snowflake-cloud-data-platform,Tsql,Snowflake Cloud Data Platform,我用Snowflake作为我们的数据仓库,但我的问题与任何支持窗口函数(如FIRST_VALUE、LAST_VALUE、LEAD和LAG)的SQL方言有关 我有一张桌子如下。 我想要的是创建另一列,比如PreferredCurrencyCurrent,它基本上应该是已创建的记录中PreferredCurrency的最新值 EventName=AccountCreated或AccountUpdateEvent2 所以,结果应该是这样的 我曾尝试先使用窗口函数\u VALUE、LEAD/LAG,但

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

我有一张桌子如下。

我想要的是创建另一列,比如PreferredCurrencyCurrent,它基本上应该是已创建的记录中PreferredCurrency的最新值 EventName=AccountCreated或AccountUpdateEvent2

所以,结果应该是这样的


我曾尝试先使用窗口函数\u 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;

我认为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;

谢谢@GarethD。问题是我还有20多个这样的列,相关子查询可能会成为性能瓶颈,而且我们的DW Snowflake不完全支持相关子查询:谢谢@GarethD。问题是,我还有20个这样的列,并且相关联的子查询可能是性能瓶颈,而且我们的DW Snowflake不完全支持相关联的子查询: