postgresql - sql - '참' 값의 수
myCol
------
true
true
true
false
false
null
위의 표에서 내가 할 경우:
select count(*), count(myCol);
알겠습니다6, 5
알겠습니다5
null 항목을 계산하지 않기 때문입니다.
참 값의 수도 계산하려면 어떻게 해야 합니까(예: 3)?
(이것은 단순화한 것이며 실제로는 카운트 함수 내에서 훨씬 더 복잡한 표현을 사용하고 있습니다.)
요약 편집: 일반 카운트(*)도 쿼리에 포함하고 싶어서 where 절을 사용할 수 없습니다.
SELECT COALESCE(sum(CASE WHEN myCol THEN 1 ELSE 0 END),0) FROM <table name>
또는 스스로 알게 된 것처럼:
SELECT count(CASE WHEN myCol THEN 1 END) FROM <table name>
포스트그레 이후SQL 9.4에는 참 값을 세는 매우 간결한 쿼리를 허용하는 절이 있습니다.
select count(*) filter (where myCol)
from tbl;
위의 쿼리는 단순한 WHERE 절로 충분하다는 점에서 잘못된 예이며 구문만 보여주는 것입니다.FILTER 절은 다른 Aggregate와 결합하기 쉽다는 점에서 중요합니다.
select count(*), -- all
count(myCol), -- non null
count(*) filter (where myCol) -- true
from tbl;
이 절은 특히 다른 열을 술어로 사용하는 열의 집계에 유용하며 단일 쿼리에서 서로 다르게 필터링된 집계를 가져올 수 있습니다.
select count(*),
sum(otherCol) filter (where myCol)
from tbl;
부울을 정수와 합으로 캐스팅합니다.
SELECT count(*),sum(myCol::int);
당신은.6,3
.
가장 좋은 방법은 nullif 함수를 사용하는 것입니다.
대체적으로
select
count(nullif(myCol = false, true)), -- count true values
count(nullif(myCol = true, true)), -- count false values
count(myCol);
또는 간단히 말하면
select
count(nullif(myCol, true)), -- count false values
count(nullif(myCol, false)), -- count true values
count(myCol);
http://www.postgresql.org/docs/9.0/static/functions-conditional.html
(주물을 사용하지 않고) 가장 짧고 게으른 솔루션은 다음 공식을 사용하는 것입니다.
SELECT COUNT(myCol OR NULL) FROM myTable;
직접 사용해 보십시오.
SELECT COUNT(x < 7 OR NULL)
FROM GENERATE_SERIES(0,10) t(x);
다음과 같은 결과를 제공합니다.
SELECT SUM(CASE WHEN x < 7 THEN 1 ELSE 0 END)
FROM GENERATE_SERIES(0,10) t(x);
부울 필드를 정수로 변환하고 합계를 수행하기만 하면 됩니다.이것은 postgresql에서 작동합니다.
select sum(myCol::int) from <table name>
도움이 되길 바랍니다!
select f1,
CASE WHEN f1 = 't' THEN COUNT(*)
WHEN f1 = 'f' THEN COUNT(*)
END AS counts,
(SELECT COUNT(*) FROM mytable) AS total_counts
from mytable
group by f1
아니면 아마 이것
SELECT SUM(CASE WHEN f1 = 't' THEN 1 END) AS t,
SUM(CASE WHEN f1 = 'f' THEN 1 END) AS f,
SUM(CASE WHEN f1 NOT IN ('t','f') OR f1 IS NULL THEN 1 END) AS others,
SUM(CASE WHEN f1 IS NOT NULL OR f1 IS NULL THEN 1 ELSE 0 END) AS total_count
FROM mytable;
MySQL에서는 다음 작업도 수행할 수 있습니다.
SELECT count(*) AS total
, sum(myCol) AS countTrue --yes, you can add TRUEs as TRUE=1 and FALSE=0 !!
FROM yourTable
;
저는 Postgres에서 이것이 효과가 있다고 생각합니다.
SELECT count(*) AS total
, sum(myCol::int) AS countTrue --convert Boolean to Integer
FROM yourTable
;
또는 그 이상(::을(를) 피하고 표준 SQL 구문을 사용하려면):
SELECT count(*) AS total
, sum(CAST(myCol AS int)) AS countTrue --convert Boolean to Integer
FROM yourTable
;
SELECT count(*) -- or count(myCol)
FROM <table name> -- replace <table name> with your table
WHERE myCol = true;
윈도우 설정 기능을 사용하는 방법은 다음과 같습니다.
SELECT DISTINCT *, count(*) over(partition by myCol)
FROM <table name>;
-- Outputs:
-- --------------
-- myCol | count
-- ------+-------
-- f | 2
-- t | 3
-- | 1
벤치마크
TL;DR: 원하는 솔루션을 선택합니다.큰 차이는 없습니다.
유틸리티 스크립트
before(){
psql <<-SQL
create table bench (
id serial
, thebool boolean
);
insert into bench (thebool)
select (random() > 0.5)
from generate_series(1, 1e6) g;
analyze bench;
SQL
}
after(){
psql -c 'drop table bench'
}
test(){
echo $(tput bold)$1$(tput sgr0)
psql -c "explain analyze select $1 from bench" | tail -4 | head -2
}
실제 벤치마크
1.4로 제작GHz i5 MacBookPro, psql 및 pg 12.4(리눅스 도커 컨테이너의 pg):
before
test 'count(*) filter (where thebool)'
# Planning Time: 0.138 ms
# Execution Time: 4424.042 ms
test 'count(case when thebool then 1 end)'
# Planning Time: 0.156 ms
# Execution Time: 4638.861 ms
test 'count(nullif(thebool, false))'
# Planning Time: 0.201 ms
# Execution Time: 5267.631 ms
test 'count(thebool or null)'
# Planning Time: 0.202 ms
# Execution Time: 4672.700 ms
test 'sum(thebool::integer)'
# Planning Time: 0.155 ms
# Execution Time: 4602.406 ms
test 'coalesce(sum(case when thebool THEN 1 ELSE 0 END), 0)'
# Planning Time: 0.167 ms
# Execution Time: 4416.503 ms
after
select count(myCol)
from mytable
group by myCol
;
3개의 가능한 부울 상태(거짓, 참, 0)를 3개의 행으로 그룹화합니다. 특히 낮과 같은 다른 열과 그룹화할 때 유용합니다.
언급URL : https://stackoverflow.com/questions/5396498/postgresql-sql-count-of-true-values
'programing' 카테고리의 다른 글
C에서 정의되었지만 사용되지 않은 기능 경고 (0) | 2023.06.07 |
---|---|
Python에서 고성능 퍼지 문자열 비교, Levenshtein 또는 difflib 사용 (0) | 2023.06.07 |
"개인 이메일 주소를 게시합니다." 오류 (0) | 2023.06.07 |
스키마 유효성 검사에 실패하고 다음 오류가 발생했습니다. 데이터 경로 ".builders['app-shell']"에는 필수 속성 'class'가 있어야 합니다. (0) | 2023.06.07 |
C에서 ((c) + 1)의 유형은 무엇입니까? (0) | 2023.06.07 |