programing

부울 열을 집계하는 방법

fastcode 2023. 3. 26. 11:51
반응형

부울 열을 집계하는 방법

어떻게 이런 튜플을 모을 수 있을까요?

COL_1 | COL_2 | COL_3 | COL_4
 val  |   T   |   F   |   F
 val  |   F   |   T   |   F

OR 기능을 사용하여 다음 표를 반환하시겠습니까?

COL_1 | COL_2 | COL_3 | COL_4
 val  |   T   |   T   |   F

간단하게,GROUP BY,사용하다MAX()사용 가능한 경우 T를 반환하고 그렇지 않으면 F를 반환합니다.

select col_1, max(col_2), max(col_3), max(col_4)
from tablename
group by col_1

참고로 (Oracle에서는 동작하지 않습니다)포스트그레SQL은 다음과 같은 작업을 수행합니다.

SELECT col_1, bool_or(col_2), bool_or(col_3), bool_or(col_4)
FROM tablename GROUP BY col_1 ORDER BY col_1

한다면COL_2로.COL_4are text columns (텍스트열)char,varchar,varchar2,nvarchar,nvarchar2포함)'T'또는'F', 그럼, 당신은 그냥 그것을 가져가면 됩니다.MAX그 중에서도'T' > 'F',예.'T'다음에 오다'F'사전순으로

SELECT COL_1, MAX(COL_2) AS COL_2, MAX(COL_3) AS COL_3, MAX(COL_4) AS COL_4
FROM table
GROUP BY COL_1

설명:적어도 1개의 오퍼랜드가 TRUE인 경우 로케이션 연산 OR은 TRUE를 반환합니다.MAX()는 TRUE를 반환합니다."T"적어도 하나의 값이"T"기타"F".


주의: Boolean 컬럼이 다음과 같이 선언된 경우

COL_x NUMBER(1) DEFAULT 0 NOT NULL

또는 다른 숫자 유형을 선택할 수 있습니다.MAX(ABS(col_x))음의 값도 TRUE로 카운트되기 때문에 (ComboBox가 부울에 연결되어 있는 액세스프런트 엔드가 있는 경우 값이 생성됩니다.0또는-1.)

SELECT col1 = MAX(CONVERT(tinyint, ISNULL(col1,0))) ...

설명: (S)처음 col1의 부울값을 취득하고, null의 경우는 false를 취득합니다.이는 BIT 대신 TINYINT 데이터 유형으로 변환됩니다.그러면 GROUP BY에서 "true가 있으면 true를 반환한다"고 효과적으로 말하는 MAX() 집약 함수를 사용할 수 있습니다.

이것을 시도해 보는 것을 추천합니다.

declare @tempTable table(bitval bit)
insert into @tempTable values(1)
insert into @tempTable values(1)
insert into @tempTable values(0)
insert into @tempTable values(1)

select min(cast(bitval as int)) as AndAggregate from @tempTable 
select max(cast(bitval as int)) as ORAggregate from @tempTable 

Amazon Redshift의 경우bool_or기능은 기능합니다.

WITH b AS (
    SELECT FALSE AS a
    UNION ALL
    SELECT TRUE
    UNION ALL
    SELECT FALSE
)
SELECT bool_or(a)
FROM b;
-- TRUE

WITH b AS (
    SELECT FALSE AS a
    UNION ALL
    SELECT FALSE
    UNION ALL
    SELECT FALSE
)
SELECT bool_or(a)
FROM b;
-- FALSE

https://docs.aws.amazon.com/redshift/latest/dg/r_BOOL_OR.html

SQL 기본 사용

SELECT tt.COL_1,
CASE when tt.COL_2==1 then T else F end AS COL_2,

CASE when tt.COL_3==1 then T else F end AS COL_3,

CASE when tt.COL_4==1 then T else F end AS COL_4,
FROM 
(SELECT COL_1,
MAX( case when COL_2==T then 1 else 0 end) as COL_2,
MAX( case when COL_3==T then 1 else 0 end) as COL_3,
MAX( case when COL_4==T then 1 else 0 end) as COL_4
FROM table GROUP BY COL_1 )as tt

언급URL : https://stackoverflow.com/questions/37947668/how-to-aggregate-boolean-column

반응형