Tsql 使用第一个_值,条件基于另一列
我用Snowflake作为我们的数据仓库,但我的问题与任何支持窗口函数(如FIRST_VALUE、LAST_VALUE、LEAD和LAG)的SQL方言有关 我有一张桌子如下。 我想要的是创建另一列,比如PreferredCurrencyCurrent,它基本上应该是已创建的记录中PreferredCurrency的最新值 EventName=AccountCreated或AccountUpdateEvent2 所以,结果应该是这样的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,但
我曾尝试先使用窗口函数\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不完全支持相关联的子查询: