高效的SQL条件计数方法
在SQL中,根据特定列对数据出现次数进行分组计数,有多种方法。在PostgreSQL中,最直接的方法是使用CASE表达式,如示例查询所示。然而,当处理大量可能值时,这种方法会变得繁琐。
PostgreSQL 9.4及更高版本提供了一种更优化、更灵活的方法:FILTER
聚合选项。FILTER
子句允许您对聚合函数应用附加条件,仅计算与特定条件匹配的特定值。
<code class="language-sql">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;</code>
此查询有效地计算了question1列中零、一和二的出现次数,并按category列分组。
为了进一步优化,可以使用以下简短版本:
<code class="language-sql">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;</code>
对于涉及多个条件或大量选项的复杂场景,crosstab()
函数提供了卓越的性能和简洁性:
<code class="language-sql">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);</code>
此crosstab
查询生成一个结果集,其中包含所有所需的计数,并以命名列的形式呈现,便于访问和分析。
以上是如何高效统计SQL中多条件数据出现的次数?的详细内容。更多信息请关注PHP中文网其他相关文章!