问题描述
创建计算表中数据出现次数的列的最佳方法是什么?表格需要按一列分组吗?
我的数据库是 PostgreSQL.
What is the best way to create columns which count the number of occurrences of data in a table? The table needs to be grouped by one column?
My database is PostgreSQL.
我见过:
SELECT
sum(CASE WHEN question1 = 0 THEN 1 ELSE 0 END) AS ZERO,
sum(CASE WHEN question1 = 1 THEN 1 ELSE 0 END) AS ONE,
sum(CASE WHEN question1 = 2 THEN 1 ELSE 0 END) AS TWO,
category
FROM reviews
GROUP BY category
其中 question1
的值可以是 0、1 或 2.
where question1
can have a value of either 0, 1 or 2.
我也看到过使用 count(CASE WHEN question1 = 0 THEN 1)
但是,随着 question1
的可能值数量的增加,编写起来会变得更加麻烦.有没有一种方便的方法来编写这个查询,可能会优化性能?
However, this becomes more cumbersome to write as the number of possible values for question1
increases. Is there a convenient way to write this query, possibly optimizing performance?
推荐答案
在 Postgres 9.4 或更高版本中,使用聚合 FILTER
选项.通常是最干净和最快的:
In Postgres 9.4 or later, use the aggregate FILTER
option. Typically cleanest and fastest:
SELECT category
, count(*) FILTER (WHERE question1 = 0) AS zero
, count(*) FILTER (WHERE question1 = 1) AS one
, count(*) FILTER (WHERE question1 = 2) AS two
FROM reviews
GROUP BY 1;
FILTER
子句的详细信息:
如果你想要它短:
SELECT category
, count(question1 = 0 OR NULL) AS zero
, count(question1 = 1 OR NULL) AS one
, count(question1 = 2 OR NULL) AS two
FROM reviews
GROUP BY 1;
更多语法变体:
crosstab()
产生最佳性能并且对于长选项列表更短:
crosstab()
yields the best performance and is shorter for long lists of options:
SELECT * FROM crosstab(
'SELECT category, question1, count(*) AS ct
FROM reviews
GROUP BY 1, 2
ORDER BY 1, 2'
, 'VALUES (0), (1), (2)'
) AS ct (category text, zero int, one int, two int);
详细说明:
这篇关于条件 SQL 计数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!