Postgres:返回列的聚合函数

时间:2017-11-01 23:27:08

标签: sql postgresql

在postgres中,当我在某些数据上调用函数时,如下所示:

select f(col_nums) from tbl_name
where col_str = '12345'

然后函数f将应用于col_str = '12345'的每一行。

另一方面,如果我在某些数据上调用聚合函数,如下所示:

select g_agg(col_nums) from tbl_name
where col_str = '12345'

然后将在整个列上调用函数g_agg,但会产生单个值。

问:如何创建一个将应用于整个列的函数并返回相同大小的列,同时了解子集中的所有值?

例如,我可以创建一个计算累积和的函数吗?

select *, sum_accum(col_nums) as cs from tbl_name
where col_str = '12345'

这样上述查询的结果如下所示:

 col_str | more_cols | col_numbers | cs
---------+-----------+-------------+----
  12345  |    567    |     1       |  1
  12345  |    568    |     2       |  3
  12345  |    569    |     3       |  6
  12345  |    570    |     4       | 10

除了将子查询结果传递给函数,然后将join传递给原始表外,别无选择吗?

1 个答案:

答案 0 :(得分:1)

使用window functions

  

窗口函数跨一组表行执行计算   这与当前行有某种关系。这与之相当   可以使用聚合函数完成的计算类型。但   与常规聚合函数不同,使用窗口函数不会   导致行被分组为单个输出行 - 行   保留他们独立的身份。在幕后,窗口   函数不仅可以访问查询的当前行   结果

e.g。

select *, sum(col_nums) OVER(PARTITION BY T.COLX, T.COLY) as cs 
from tbl_name T
where col_str = '12345'

请注意,over clause上的添加会将聚合从其传统用途更改为window function

  

OVER子句使它被视为窗口函数和   在一组适当的行上计算

over clause中有partition by(类似于group by),它控制执行计算的window;它还允许order by对某些函数有效,但不是全部函数。

select *
   -- running sum using an order by
 , sum(col_nums) OVER(PARTITION BY T.COLX ORDER BY T.COLY) as cs 

   -- but count does not permit ordering
 , count(*) OVER(PARTITION BY T.COLX) as cs_count
from tbl_name T
where col_str = '12345'