查看当前日期 30 天前的运行中位数

cya*_*ahn 4 sql snowflake-cloud-data-platform

背景:我有一个如下表,我试图value根据每个created_date分区的滚动 30 天回溯来获取中位数city

问题是我缺少某些城市的日期,因此bound by rows preceding在这种情况下不起作用。

注意:我确实有一个date-spine可以利用的表格,但不确定它在这里是否有帮助

创建日期 城市 价值
2018-08-30 夏洛特 374900
2018-08-31 夏洛特 272000
2018-09-10 夏洛特 1
2018-09-24 夏洛特 365000
2018-10-04 夏洛特 342000
2018-10-07 夏洛特 46万
2018-10-08 夏洛特 91000
2018-10-15 夏洛特 342000
2018-10-18 夏洛特 155000
2018-10-19 夏洛特 222000
... ... ...

预期输出:

创建日期 城市 价值 MOVING_MEDIAN_30_DAY
2018-08-30 夏洛特 374900 374900
2018-08-31 夏洛特 272000 323450
2018-09-10 夏洛特 1 272000
2018-09-24 夏洛特 365000 318500
2018-10-04 夏洛特 342000 342000
2018-10-07 夏洛特 46万 353500
2018-10-08 夏洛特 91000 342000
2018-10-15 夏洛特 342000 342000
2018-10-18 夏洛特 155000 342000
2018-10-19 夏洛特 222000 342000
... ... ... ...

问题:如何使用 sql/snowflake 获得预期输出?

提前致谢!!

Tee*_*eej 6

由于Snowflake的MEDIAN窗口函数不支持滑动框架,所以我们必须采取另一种方法。我们可以使用 Snowflake 的MEDIAN聚合函数以及自连接来模拟窗口函数。

 SELECT original.created_date
      , original.city
      , original.value
      , MEDIAN(window.value) AS rolling_30_day_median
   FROM cities AS original
   LEFT JOIN cities AS window
     ON original.city = window.city
    AND DATEDIFF(days, original.created_date, window.created_date) BETWEEN -30 AND 0
  GROUP BY 1, 2, 3
  ORDER BY 1
;
Run Code Online (Sandbox Code Playgroud)

这会产生所需的输出。

创建日期 城市 价值 ROLLING_30_DAY_MEDIAN
2018-08-30 夏洛特 374,900 374,900
2018-08-31 夏洛特 272,000 323,450
2018-09-10 夏洛特 1 272,000
2018-09-24 夏洛特 365,000 318,500
2018-10-04 夏洛特 342,000 342,000
2018-10-07 夏洛特 460,000 353,500
2018-10-08 夏洛特 91,000 342,000
2018-10-15 夏洛特 342,000 342,000
2018-10-18 夏洛特 155,000 342,000
2018-10-19 夏洛特 222,000 342,000