在PostgreSQL中计算移动天气统计信息

在PostgreSQL中计算移动天气统计信息,sql,postgresql,window-functions,Sql,Postgresql,Window Functions,我试图在我的PostgreSQL气象数据表中计算自上次下雨以来的天数以及该事件中每天的降雨量。我一直试图通过窗口函数来实现这一点,但范围必须是无界的限制让我有点难以继续。 以下是我到目前为止的疑问: SELECT station_num, ob_date, rain, max(rain) OVER (PARTITION BY station_num ORDER BY ob_date ASC RANGE BETWEEN UNBOUND

我试图在我的PostgreSQL气象数据表中计算自上次下雨以来的天数以及该事件中每天的降雨量。我一直试图通过窗口函数来实现这一点,但范围必须是无界的限制让我有点难以继续。 以下是我到目前为止的疑问:

SELECT
        station_num,
        ob_date,
        rain,
        max(rain) OVER (PARTITION BY station_num ORDER BY ob_date ASC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as prev_rain_mm,
        '' as days_since_rain --haven't attempted this calculation yet
FROM
        obs_daily_ground_moisture
其结果如下:

但我正在努力实现更像这样的目标:


我觉得窗口函数范围、过滤器和嵌套查询的所有部分都在那里,但我不确定如何将它们结合在一起。此外,上述数据只是实际数据集的一个子集,整个数据集刚好超过50万行。

这里的关键是对从首次出现rain>0值到下一次出现rain>0值的观测值进行分组。此后,您可以使用窗口函数来计算所需的列

select 
x.station_num,
x.ob_date, 
max(rain) over(partition by station_num,col) prev_rain,
case when rain > 0 then 0 
else row_number() over(partition by station_num, col order by ob_date)-1 end days_since_rain
from (select t.*,
      sum(case when rain > 0 then 1 else 0 end) over(partition by station_num order by ob_date) col 
      from t) x
试试这个

        DECLARE @Rain  AS FLOAT

        UPDATE A
        SET
        @Rain = CASE WHEN A.Rain = 0 THEN @Rain ELSE A.Rain END,
        A.Rain = CASE WHEN @Rain IS NULL OR A.Rain <> 0 THEN A.Rain ELSE @Rain END
        FROM obs_daily_ground_moisture A

        SELECT ob_date, Rain, 
        max(rain) OVER (PARTITION BY station_num ORDER BY ob_date ASC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as prev_rain_mm,
        ROW_NUMBER() OVER(PARTITION BY Rain ORDER BY ob_date) - 1  as days_since_rain
        FROM obs_daily_ground_moisture ORDER BY ob_date
将@Rain声明为FLOAT
更新
设置
@雨=当A.Rain=0时,则@Rain否则A.Rain结束,
A.Rain=当@Rain为空或A.Rain为0时,则A.Rain ELSE@Rain END
来自obs\u每日\u地面\u湿度A
选择ob_日期、降雨、,
最大(雨量)超过(按站点划分,按编号顺序,按ob\U日期ASC范围,在无界的前一行和当前行之间)作为上一行雨量,
行号()超过(按降雨顺序划分,按ob_日期)-1为自降雨以来的天数
从obs_每日地面水分订单(按ob_日期)

谢谢vkp!这看起来可以在下雨后的几天内完成这项工作(我甚至还没有解决这个问题),但是你对获取之前的rain值有什么想法吗?我的max()窗口函数是我所能得到的。请参阅编辑的版本
col
内部查询中的计算基本上将从第一次出现rain>0值到下一次出现rain>0值的观测值分组为一个组。谢谢,在看到您的编辑结果之前,我刚刚用您的rain之后的天的代码想出了一种稍微不同的方法version@vkp,什么是
col
?请您提供一些参考资料好吗?@TanjimRahman col是from子句中表达式
sum(当rain>0时,则为1,否则为0结束)的别名,该表达式在from子句中使用postgresql。您的答案似乎是针对MS SQL的server@a_horse_with_no_name我没有粘贴代码的图像,我的代码可以复制和粘贴。我张贴了桌子的图片。如果有一个很好的方法让桌子进入所以请建议。我本来可以用sqlfiddle上传一些示例数据和代码,但是在发布网站的时候,网站被关闭了,因此我上传了表格的图片,因为它展示了我试图实现的结果。