sql - 难以定义分区的平均值

标签 sql postgresql null aggregate-functions window-functions

我有这张表:

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。

SQL Fiddle

最佳答案

我找到了一个非常简单的解决方案:

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;

-> sqlfiddle

由于 count() 忽略 NULL 值,您可以使用运行计数(窗口函数中的默认值)快速对值进行分组 (-> grp).

每个组都有一个 非空值,因此我们可以使用 min/max/sum 在另一个窗口函数中得到相同的结果。除以 grp 中的成员数量(count(*) 这次,要计算 NULL 值!),我们就完成了。

关于sql - 难以定义分区的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13237801/

相关文章:

sql - 插入带有标识列的多个字段不起作用

postgresql - Postgres COUNT FILTER 语法错误 - 为什么?

java - 为什么此代码出现错误 : NullPointerException?

iOS:NSString 丢失 URL,显示 (null)

mysql - 如何使用原始 SQL 确定 MySQL 中的 csv 格式字段中是否包含特定值?

SQL 连接而不是嵌套查询

python - 如何在 Python sqlite3 中使用元组选择 WHERE IN VALUES?

linux - Propel 生成 0 而不是 false

wpf - 清除文本框不会将绑定(bind)设置为 null

SQL:减去两列