官术网_书友最值得收藏!

  • Mastering PostgreSQL 12
  • Hans Jürgen Sch?nig
  • 286字
  • 2021-08-20 10:00:34

Utilizing windowing functions and analytics

Now that we have discussed ordered sets, it is time to take a look at windowing functions. Aggregates follow a fairly simple principle; take many rows and turn them into fewer, aggregated rows. A windowing function is different. It compares the current row with all rows in the group. The number of rows returned does not change. Here is an example:

test=# SELECT avg(production) FROM t_oil; 
    avg 
----------- 
 2607.5139  
(1 row) 

test=# SELECT country, year, production,
consumption, avg(production) OVER ()
FROM t_oil
LIMIT 4;
country | year | production | consumption | avg ---------+-------+------------+-------------+---------- USA | 1965 | 9014 | 11522 | 2607.5139 USA | 1966 | 9579 | 12100 | 2607.5139 USA | 1967 | 10219 | 12567 | 2607.5139 USA | 1968 | 10600 | 13405 | 2607.5139 (4 rows)

The average production in our dataset is around 2.6 million barrels per day. The goal of this query is to add this value as a column. It is now easy to compare the current row to the overall average.

Keep in mind that the OVER clause is essential. PostgreSQL is unable to process the query without it:

test=# SELECT country, year, production, consumption, avg(production) FROM  t_oil; 
psql: ERROR: column "t_oil.country" must appear in the GROUP BY clause or be used
in an aggregate function LINE 1: SELECT country, year, production, consumption, avg(productio...

This actually makes sense because the average has to be defined precisely. The database engine cannot just guess any value.

Other database engines can accept aggregate functions without an OVER or even a GROUP BY clause. However, from a logical point of view, this is wrong and, on top of that, a violation of SQL.
主站蜘蛛池模板: 萍乡市| 芦溪县| 逊克县| 阳曲县| 文山县| 蒲江县| 德保县| 朔州市| 富宁县| 武清区| 通山县| 稻城县| 洪泽县| 兴业县| 绍兴市| 亚东县| 孟津县| 蒲江县| 临沂市| 军事| 富平县| 桐乡市| 高雄县| 鄂州市| 广宗县| 罗源县| 安远县| 额敏县| 玉山县| 莱西市| 甘孜县| 瑞丽市| 刚察县| 肥东县| 万年县| 永兴县| 双牌县| 安阳市| 荣昌县| 婺源县| 宁河县|