programing tip

BIT 필드에 MIN 집계 함수 적용

itbloger 2020. 10. 23. 07:40
반응형

BIT 필드에 MIN 집계 함수 적용


다음 쿼리를 작성하고 싶습니다.

SELECT   ..., MIN(SomeBitField), ...
FROM     ...
WHERE    ...
GROUP BY ...

문제는 SQL Server가 비트 필드의 최소값을 계산하려고 할 때 오류를 반환하는 것을 좋아하지 않는다는 것Operand data type bit is invalid for min operator 입니다.

다음 해결 방법을 사용할 수 있습니다.

SELECT   ..., CAST(MIN(CAST(SomeBitField AS INT)) AS BIT), ...
FROM     ...
WHERE    ...
GROUP BY ...

그러나 더 우아한 것이 있습니까? (예를 들어, 내가 모르는, and필드의 비트 값 의 논리를 평가하는 집계 함수가있을 수 있습니다 .)


에는 두 가지 옵션 BIT만 있으므로 case 문을 사용하십시오.

SELECT CASE WHEN EXISTS (SELECT 1 FROM ....) THEN 1 ELSE 0 END AS 'MinBit'
FROM ...
WHERE ...

다음과 같은 이점이 있습니다.

  • 테이블 스캔을 강요하지 않음 ( BIT필드의 인덱스는 거의 사용되지 않음)
  • 단락 TWICE (에 대해 한 번 EXISTS반복 CASE)

작성해야 할 코드가 조금 더 많지만 끔찍하지는 않습니다. 확인할 값이 여러 개인 경우 쿼리 시작 부분에 더 큰 결과 집합 ( JOINFILTER기준 포함)을 항상 캡슐화 CTE한 다음 CASE에서 참조 할 수 있습니다.


한 가지 옵션은 MIN(SomeBitField+0)입니다. 소음이 적고 잘 읽혀집니다 (우아함으로 인정됩니다).

즉, CASE옵션 보다 해킹에 가깝습니다 . 그리고 나는 속도 / 효율성에 대해 아무것도 모릅니다.


이 쿼리가 최상의 솔루션입니다.

SELECT CASE WHEN MIN(BitField+0) = 1 THEN 'True' ELSE 'False' END AS MyColumn
 FROM MyTable

BitField + 0을 추가하면 자동으로 int처럼됩니다.


다음을 시도해보십시오 : 최소 표현 및 집계 함수, 최대 표현 또는 집계 함수

SELECT   ..., MIN(case when SomeBitField=1 then 1 else 0 end), MIN(SomeBitField+0)...
FROM     ...
WHERE    ...
GROUP BY ...

같은 결과


select min(convert(int, somebitfield))

또는 결과를 비트로 유지하려면

select convert(bit, min(convert(int, somebitfield)))

이 작은 코드는 항상 저와 함께 매력적으로 작용했습니다.

CONVERT(BIT, MIN(CONVERT(INT, BitField))) as BitField

AVG (CAST (boolean_column AS FLOAT)) OVER (...) AS BOOLEAN_AGGREGATE

퍼지 부울을 지정하십시오.

  • 1은 모두 참임을 나타냅니다.

  • 0은 모두 거짓임을 나타냅니다.

  • ] 0..1 [사이의 값은 부분 일치를 나타내며 일정 비율의 진실 일 수 있습니다.

참고 URL : https://stackoverflow.com/questions/6997721/applying-the-min-aggregate-function-to-a-bit-field

반응형