雪花上带有 RANGE 的滑动窗框的替代品

Thi*_*ima 5 sql snowflake-cloud-data-platform

我正在将一些 BigQuery 代码迁移到雪花,但在使用带有范围的 Window 函数时遇到了一些麻烦。这是因为 Snowflake 系列不支持滑动窗框。我需要使用“2 前一行和当前行之间的范围”逻辑,关于如何在雪花上复制此逻辑有什么想法吗?

WITH base AS (
  SELECT * FROM (
    SELECT 7 AS num
    UNION ALL SELECT 2 AS num
    UNION ALL SELECT 2 AS num
    UNION ALL SELECT 5 AS num
    UNION ALL SELECT 3 AS num
    UNION ALL SELECT 7 AS num
    UNION ALL SELECT 7 AS num
))
SELECT
num,
COUNT(*) OVER (ORDER BY num ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS row_count,
COUNT(*) OVER (ORDER BY num RANGE BETWEEN 2 PRECEDING AND CURRENT ROW) AS range_count,
SUM(num) OVER (ORDER BY num ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS row_sum,
SUM(num) OVER (ORDER BY num RANGE BETWEEN 2 PRECEDING AND CURRENT ROW) AS range_sum
FROM base
ORDER BY num
Run Code Online (Sandbox Code Playgroud)

预期结果:在此输入图像描述

Fel*_*ffa 3

从评论中获取具体问题:您可以使用子查询来解决这个问题。

例如,在这里我将查找每行的 MIN(先前值),回顾 365 天,并按客户分区:

with DATA as (
  select *
  from SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.ORDERS
)

select O_CUSTKEY, O_ORDERDATE, O_TOTALPRICE
  , (
    select min(O_TOTALPRICE) 
    from DATA 
    where A.O_CUSTKEY=O_CUSTKEY
    and O_ORDERDATE between A.O_ORDERDATE-365 and A.O_ORDERDATE
  ) min_value
from DATA A
order by O_CUSTKEY, O_ORDERDATE
limit 10;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述