在Snowflake中使用嵌套窗口函数 [英] Using nested window function in Snowflake
本文介绍了在Snowflake中使用嵌套窗口函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我看到了很多关于此常规错误的问题,但我不明白为什么会有它,可能是因为嵌套的窗口函数...
使用下面的查询,我得到了
Col_C
、Col_D
、...几乎所有我试过的东西
SQL编译错误:[eachColumn]不是有效的GROUP BY表达式
SELECT
Col_A,
Col_B,
FIRST_VALUE(Col_C) IGNORE NULLS OVER (PARTITION BY Col_A, Col_B
ORDER BY Col_TimeStamp ASC
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),
MAX(Col_D) OVER (PARTITION BY Col_A, Col_B
ORDER BY Col_TimeStamp ASC
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),
FIRST_VALUE(CASE WHEN Col_T = 'testvalue'
THEN LAST_VALUE(Col_E) IGNORE NULLS OVER (PARTITION BY Col_A, Col_B
ORDER BY Col_TimeStamp DESC
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
ELSE NULL END) IGNORE NULLS
OVER (PARTITION BY Col_A, Col_B
ORDER BY Col_TimeStamp ASC
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
FROM mytable
那么,是否有在Snowflake(使用case when ...
)中使用嵌套窗口函数的方法?如果有,我做错了什么?
推荐答案
我看到了很多关于此常规错误的问题,但我不明白为什么会有它,可能是因为嵌套的窗口函数...
Snowflake支持在同一级别(有时称为"lateral column alias reference")重用表达式
完全可以写:
SELECT 1+1 AS col1,
col1 *2 AS col2,
CASE WHEN col1 > col2 THEN 'Y' ELSE 'NO' AS col3
...
在标准SQL中,您要么必须使用多层查询(CTE),要么必须使用横向联接。相关:PostgreSQL: using a calculated column in the same query
遗憾的是,相同的语法不适用于分析函数(我现在知道任何支持它的RDMB):
SELECT ROW_NUMBER() OVER(PARTITION BY ... ORDER BY ...) AS rn
,MAX(rn) OVER(PARTITION BY <different than prev) AS m
FROM tab;
SQL Standard 2016新增可选功能:T619嵌套窗口函数
这里是一篇关于嵌套分析函数查询的文章:Nested window functions in SQL。
这意味着当前嵌套开窗函数方式是使用派生表/CTE:
WITH cte AS (
SELECT ROW_NUMBER() OVER(PARTITION BY ... ORDER BY ...) AS rn
,*
FROM tab
)
SELECT *, MAX(rn) OVER(PARTITION BY <different than prev) AS m
FROM cte
这篇关于在Snowflake中使用嵌套窗口函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文