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

Utilizing windowing functions and analytics

After discussing 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 not able to process the query without it:

test=# SELECT country, year, production, consumption, avg(production)  
FROM t_oil;
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 take any value, which might be right by doing guesswork.

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.
主站蜘蛛池模板: 马公市| 柞水县| 榆社县| 大新县| 丰顺县| 浦江县| 晋城| 大竹县| 分宜县| 苏尼特右旗| 浑源县| 花垣县| 伊金霍洛旗| 图木舒克市| 桂平市| 衡阳市| 怀仁县| 靖远县| 周宁县| 贞丰县| 永寿县| 宿迁市| 德化县| 贵溪市| 临安市| 通许县| 阜新市| 明溪县| 寿宁县| 盱眙县| 虹口区| 诸城市| 海晏县| 关岭| 容城县| 洛浦县| 城口县| 武胜县| 乐陵市| 龙江县| 宝坻区|