我有这张表:
create table t (value int, dt date);
value | dt
-------+------------
10 | 2012-10-30
15 | 2012-10-29
null | 2012-10-28
null | 2012-10-27
7 | 2012-10-26
我想要这个输出:
value | dt
-------+------------
10 | 2012-10-30
5 | 2012-10-29
5 | 2012-10-28
5 | 2012-10-27
7 | 2012-10-26
当表按日期降序排序时,我希望空值以及前一个非空值被前一个非空值的平均值替换。在此示例中,值 15 是下两个空值的前一个非空值。所以 15/3 = 5。
最佳答案
我找到了一个非常简单的解决方案:
SELECT max(value) OVER (PARTITION BY grp)
/ count(*) OVER (PARTITION BY grp) AS value
,dt
FROM (
SELECT *, count(value) OVER (ORDER BY dt DESC) AS grp
FROM t
) a;
由于 count()
忽略 NULL
值,您可以使用运行计数(窗口函数中的默认值)快速对值进行分组 (-> grp
).
每个组都有一个 非空值,因此我们可以使用 min/max/sum 在另一个窗口函数中得到相同的结果。除以 grp
中的成员数量(count(*)
这次,要计算 NULL
值!),我们就完成了。
关于sql - 难以定义分区的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13237801/