PostgreSQL CUBE 用法与实例
本文介绍了如何在 PostgreSQL 中的 GROUP BY
子句中使用 CUBE
以在一次查询中生成多个维度的报表。
在 PostgreSQL 中, CUBE
是 GROUP BY
子句的参数,允许您在一次查询中生成多个维度的报表。和 ROLLUP
一样, 在某些特定的场景下, CUBE
可以简化 GROUPING SETS
。
PostgreSQL CUBE
语法
下面的语法说明了如何在 GROUP BY
子句中使用 CUBE
:
SELECT ...
FROM table_name
[WHERE ...]
GROUP BY
CUBE (
group_expr_1
[, group_expr_2, ...]
)
;
这里, CUBE
是 GROUP BY
子句的参数,它必须在 GROUP BY
关键字的后面。
CUBE
子句都可以使用 GROUPING SETS
子句实现,比如:
CUBE(a, b)
等效于GROUPING SETS((a,b), (a), (b), ())
。CUBE(a, b, c)
等效于GROUPING SETS((a,b,c), (a,b), (a,c), (a), (b,c), (b), (c), ())
。
CUBE
子句比 GROUPING SETS
子句更加的简单和易读。但是,它的的适应性不如 GROUPING SETS
广泛。
PostgreSQL GROUP BY
实例
我们将使用 Sakila 示例数据库 中的表进行演示,请您先在 PostgreSQL 中安装 Sakila 示例数据库。
在 Sakila 示例数据库中, film
表存储了 DVD 商店中的所有影片。
要从 film
表中查找每个影片评级中每个租金的影片的数量,每个影片评级中的影片的数量,每个租金的影片的数量,以及所有影片的总数量,您可以使用如下带有 GROUPING SETS
的语句:
SELECT
rating,
rental_rate,
count(*)
FROM
film
GROUP BY
GROUPING SETS (
(rating, rental_rate),
(rating),
(rental_rate),
()
)
ORDER BY
rating, rental_rate;
rating | rental_rate | count
--------+-------------+-------
G | 0.99 | 64
G | 2.99 | 59
G | 4.99 | 55
G | | 178
PG | 0.99 | 62
PG | 2.99 | 64
PG | 4.99 | 68
PG | | 194
PG-13 | 0.99 | 72
PG-13 | 2.99 | 74
PG-13 | 4.99 | 77
PG-13 | | 223
R | 0.99 | 70
R | 2.99 | 60
R | 4.99 | 65
R | | 195
NC-17 | 0.99 | 73
NC-17 | 2.99 | 66
NC-17 | 4.99 | 71
NC-17 | | 210
| 0.99 | 341
| 2.99 | 323
| 4.99 | 336
| | 1000
(24 rows)
这里,我们 GROUPING SETS
使用了 3 个表达式,如下:
(rating, rental_rate)
: 按照影片评级和租金统计影片的数量。(rating)
: 按照影片评级统计数量。(rental_rate)
: 按照租金统计数量。()
: 统计所有影片的数量。
在这种情况下, 这个 GROUPING SETS
可以使用 CUBE
来简化,如下:
SELECT
rating,
rental_rate,
count(*)
FROM
film
GROUP BY
CUBE (rating, rental_rate)
ORDER BY
rating, rental_rate;
rating | rental_rate | count
--------+-------------+-------
G | 0.99 | 64
G | 2.99 | 59
G | 4.99 | 55
G | | 178
PG | 0.99 | 62
PG | 2.99 | 64
PG | 4.99 | 68
PG | | 194
PG-13 | 0.99 | 72
PG-13 | 2.99 | 74
PG-13 | 4.99 | 77
PG-13 | | 223
R | 0.99 | 70
R | 2.99 | 60
R | 4.99 | 65
R | | 195
NC-17 | 0.99 | 73
NC-17 | 2.99 | 66
NC-17 | 4.99 | 71
NC-17 | | 210
| 0.99 | 341
| 2.99 | 323
| 4.99 | 336
| | 1000
(24 rows)
在上面的语句中,我们使用 CUBE (rating, rental_rate)
代替了 GROUPING SETS ((rating, rental_rate), (rating), (rental_rate),())
。这让语句更加简单,可读性更好。
结论
在 PostgreSQL 中的 GROUP BY
子句中,您可以在特定的场景下使用 CUBE
简化 GROUPING SETS
。