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

Combining grouping sets with the FILTER clause

In real-world applications, grouping sets can often be combined with FILTER clauses. The idea behind the FILTER clause is to be able to run partial aggregates.

Here is an example:

test=# SELECT region, 
avg(production) AS all, avg(production) FILTER (WHERE year < 1990) AS old, avg(production) FILTER (WHERE year >= 1990) AS new FROM t_oil GROUP BY ROLLUP (region);

region | all | old | new
---------------+----------------+----------------+----------------
Middle East | 1992.603686635 | 1747.325892857 | 2254.233333333
North America | 4541.362318840 | 4471.653333333 | 4624.349206349
| 2607.513986013 | 2430.685618729 | 2801.183150183 (3 rows)

The idea here is that not all columns will use the same data for aggregation. The FILTER clauses allow you to selectively pass data to those aggregates. In my example, the second aggregate will only consider data before 1990, while the third aggregate will take care of more recent data.

If it is possible to move conditions to a WHERE clause, it is always more desirable, as less data has to be fetched from the table. FILTER is only useful if the data left by the WHERE clause is not needed by each aggregate.

FILTER works for all kinds of aggregates and offers a simple way to pivot your data. Also, FILTER is faster than mimicking the same behavior with CASE WHEN ... THEN NULL ... ELSE END. You can find some real performance comparison here: https://www.cybertec-postgresql.com/en/postgresql-9-4-aggregation-filters-they-do-pay-off/.

主站蜘蛛池模板: 镇雄县| 定西市| 晋州市| 稻城县| 古田县| 股票| 桂林市| 井陉县| 锦屏县| 卓资县| 林芝县| 论坛| 萍乡市| 中牟县| 延津县| 石河子市| 宜兴市| 五台县| 洛川县| 旅游| 平顶山市| 寿宁县| 德昌县| 惠东县| 清远市| 宁津县| 库尔勒市| 宁蒗| 太原市| 壶关县| 余江县| 鄂伦春自治旗| 孟连| 浦东新区| 石狮市| 衡阳县| 娄烦县| 望城县| 澎湖县| 商南县| 油尖旺区|