postgresql - sql - “true”值的计数
myCol
------
true
true
true
false
false
null
在上表中,如果我这样做:
select count(*), count(myCol);
我得到 6, 5
我得到 5
因为它不计算空条目。
我如何计算真值的数量(示例中为 3)?
(这是一个简化,我实际上在 count 函数中使用了一个更复杂的表达式)
编辑摘要:我还想在查询中包含一个简单的 count(*) ,所以不能使用 where 子句
myCol
------
true
true
true
false
false
null
In the above table, if I do :
select count(*), count(myCol);
I get 6, 5
I get 5
as it doesn't count the null entry.
How do I also count the number of true values (3 in the example)?
(This is a simplification and I'm actually using a much more complicated expression within the count function)
Edit summary: I also want to include a plain count(*) in the query, so can't use a where clause
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
或者,正如您自己发现的那样:
or, as you found out for yourself:
从 PostgreSQL 9.4 开始,出现了
FILTER
子句,它允许非常简洁的查询来计算真实值:上面的查询是一个不好的例子,因为一个简单的 WHERE 子句就足够了,并且仅用于演示语法。 FILTER 子句的亮点在于它很容易与其他聚合组合:
该子句对于使用另一列作为谓词的列上的聚合特别方便,同时允许在单个查询中获取不同过滤的聚合:
Since PostgreSQL 9.4 there's the
FILTER
clause, which allows for a very concise query to count the true values:The above query is a bad example in that a simple WHERE clause would suffice, and is for demonstrating the syntax only. Where the FILTER clause shines is that it is easy to combine with other aggregates:
The clause is especially handy for aggregates on a column that uses another column as the predicate, while allowing to fetch differently filtered aggregates in a single query:
将布尔值转换为整数并求和。
你得到
6,3
。Cast the Boolean to an integer and sum.
You get
6,3
.也许,最好的方法是使用 nullif 函数。
一般
或简短
http://www.postgresql.org/docs/ 9.0/static/functions-conditional.html
probably, the best approach is to use nullif function.
in general
or in short
http://www.postgresql.org/docs/9.0/static/functions-conditional.html
最短和最懒(无需强制转换)的解决方案是使用以下公式:
自己尝试:
给出与以下相同的结果
The shortest and laziest (without casting) solution would be to use the formula:
Try it yourself:
gives the same result than
只需将布尔字段转换为整数并进行求和即可。这适用于 postgresql :
希望有帮助!
Simply convert boolean field to integer and do a sum. This will work on postgresql :
Hope that helps!
或者也许这个
Or Maybe this
在 MySQL 中,您也可以这样做:
我认为在 Postgres 中,这有效:
或者更好(避免 :: 并使用标准 SQL 语法):
In MySQL, you can do this as well:
I think that in Postgres, this works:
or better (to avoid :: and use standard SQL syntax):
基准
TL;DR:采用您喜欢的解决方案。没有显着差异。
实用程序脚本
实际基准测试
在 1.4GHz i5 MacBookPro、psql 和 pg 12.4(pg 在 Linux docker 容器中)上进行:
Benchmark
TL;DR: take the solution you like. There's no significant difference.
Utility scripts
Actual benchmark
Made on a 1.4GHz i5 MacBookPro, psql and pg 12.4 (pg in a linux docker container):
这是一种使用窗口函数的方法:
Here's a way with Windowing Function:
将 bool (false, true, 0) 的 3 种可能状态分为三行
与另一列(如日期)分组在一起时特别方便
will group the 3 possible states of bool (false, true, 0) in three rows
especially handy when grouping together with another column like day