在Snowflake中使用嵌套窗口函数 [英] Using nested window function in Snowflake

查看:18
本文介绍了在Snowflake中使用嵌套窗口函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我看到了很多关于此常规错误的问题,但我不明白为什么会有它,可能是因为嵌套的窗口函数...


使用下面的查询,我得到了Col_CCol_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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆