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

Utilizing windowing functions and analytics

Now 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 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 guess at 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.
主站蜘蛛池模板: 东乌| 黔西| 曲水县| 高雄市| 敖汉旗| 明水县| 亳州市| 广水市| 高淳县| 濮阳市| 信丰县| 公主岭市| 淮北市| 阿拉善盟| 岫岩| 宁陵县| 抚远县| 博野县| 德格县| 阳信县| 张家口市| 温泉县| 登封市| 荥阳市| 应用必备| 白朗县| 衡山县| 府谷县| 密云县| 绍兴县| 古丈县| 孟连| 招远市| 澎湖县| 磐安县| 海丰县| 都安| 天台县| 加查县| 怀安县| 铜鼓县|