在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
传递给原始表外,别无选择吗?
答案 0 :(得分:1)
窗口函数跨一组表行执行计算 这与当前行有某种关系。这与之相当 可以使用聚合函数完成的计算类型。但 与常规聚合函数不同,使用窗口函数不会 导致行被分组为单个输出行 - 行 保留他们独立的身份。在幕后,窗口 函数不仅可以访问查询的当前行 结果
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'