Program Club

MIN 또는 MAX에 null 값을 포함하려면 어떻게해야합니까?

proclub 2021. 1. 6. 19:58
반응형

MIN 또는 MAX에 null 값을 포함하려면 어떻게해야합니까?


시간대 데이터를 저장하는 테이블이 있습니다. 테이블에는 다음과 유사한 스키마가 있습니다.

ID INT NOT NULL IDENTITY(1,1)   
RecordID INT NOT NULL  
StartDate DATE NOT NULL  
EndDate DATE NULL  

그리고 각 레코드 ID의 시작 및 종료 날짜를 계산하여 최소 StartDate 및 최대 EndDate를 계산하려고합니다. StartDate는 nullable이 아니므로 이에 대해 걱정할 필요는 없지만 현재 실행중인 시간 범위임을 나타내려면 MAX (EndDate)가 필요합니다.

EndDate의 NULL 값을 유지하고이를 최대 값으로 처리하는 것이 중요합니다.

가장 간단한 시도 (아래)는 MIN과 MAX가 NULLS를 무시한다는 문제를 강조하여 작동하지 않습니다 (출처 : http://technet.microsoft.com/en-us/library/ms179916.aspx ).

SELECT recordid, MIN(startdate), MAX(enddate) FROM tmp GROUP BY recordid

기본 설정이 완료된 SQL Fiddle을 만들었습니다.

http://sqlfiddle.com/#!3/b0a75

SQLFiddle에 제공된 데이터에서 다음 결과를 생성하기 위해 SQL Server 2008을 어떻게 구부릴 수 있습니까?

RecordId  Start       End  
1         2009-06-19  NULL
2         2012-05-06  NULL
3         2013-01-25  NULL
4         2004-05-06  2009-12-01

약간 못 생겼지 만 NULLs는 당신에게 특별한 의미를 가지고 있기 때문에 이것이 제가 생각할 수있는 가장 깨끗한 방법입니다.

SELECT recordid, MIN(startdate),
   CASE WHEN MAX(CASE WHEN enddate IS NULL THEN 1 ELSE 0 END) = 0
        THEN MAX(enddate)
   END
FROM tmp GROUP BY recordid

즉, 행에가있는 경우 해당 행이 NULL답이되도록 강제하고 싶습니다. 행에 a NULL없는 경우에만 MIN(또는 MAX)을 반환해야합니다 .


원하는 효과는 NULL을 가능한 가장 큰 날짜로 ​​처리 한 다음 완료되면 다시 NULL로 바꾸는 것입니다.

SELECT RecordId, MIN(StartDate), NULLIF(MAX(COALESCE(EndDate,'9999-12-31')),'9999-12-31') 
  FROM tmp GROUP BY RecordId

바이올린 당 이것은 모든 조건에서 지정한 정확한 결과를 반환합니다.


내 식에서-count (enddate)는 enddate가 null이 아닌 행 수를 계산합니다. count (*)는 총 행 수를 계산합니다. 비교하면 enddate에 null이 포함되어 있는지 쉽게 알 수 있습니다. 동일한 경우 max (enddate)가 결과입니다. 그렇지 않으면 케이스는 기본적으로 답인 null을 반환합니다. 이 정확한 검사를 수행하는 매우 인기있는 방법입니다.

SELECT recordid, 
MIN(startdate), 
case when count(enddate) = count(*) then max(enddate) end
FROM tmp 
GROUP BY recordid

IsNull 사용

SELECT recordid, MIN(startdate), MAX(IsNull(enddate, Getdate()))
FROM tmp 
GROUP BY recordid

두 번째 명령에서 MIN을 MAX로 수정했습니다.


주어진 RecordID에 대해 EndDate 열에 null이있는 레코드가 하나만 있다고 가정하면 다음과 같이 원하는 출력을 얻을 수 있습니다.

WITH cte1 AS
(
SELECT recordid, MIN(startdate) as min_start , MAX(enddate) as max_end
FROM tmp 
GROUP BY recordid
)

SELECT a.recordid, a.min_start , 
CASE 
   WHEN b.recordid IS  NULL THEN a.max_end
END as max_end
FROM cte1 a
LEFT JOIN tmp b ON (b.recordid = a.recordid AND b.enddate IS NULL)

분석 기능 사용 :

select case when 
    max(field) keep (dense_rank first order by datfin desc nulls first) is null then 1 
    else 0 end as flag 
from MYTABLE;

유니온을 사용하여 두 개의 쿼리를 결합하여 원하는 반환 형식을 지정하려고합니다.

SELECT recordid, startdate, enddate FROM tmp Where enddate is null UNION SELECT recordid, MIN(startdate), MAX(enddate) FROM tmp GROUP BY recordid

하지만 노조가 성과에 큰 영향을 미칠지 모르겠습니다

참조 URL : https://stackoverflow.com/questions/21286215/how-can-i-include-null-values-in-a-min-or-max

반응형