복붙노트

[SQL] 어떻게 MIN 또는 MAX에서 널 (null) 값을 포함 할 수 있습니까?

SQL

어떻게 MIN 또는 MAX에서 널 (null) 값을 포함 할 수 있습니까?

나는 시간 범위 데이터를 저장하고 테이블을 가지고있다. 테이블이 스키마 비슷한에있다 :

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

그리고, 각 레코드 ID의 시작 및 종료 날짜를 해결하려고 노력하고있는 최소 STARTDATE 및 최대 종료 날짜 그래서. 나는 이것에 대해 걱정할 필요가 없습니다 STARTDATE는 널 (NULL)이 아니라 내가 MAX는 (종료 날짜)이 현재 실행중인 시간 범위는 것을 의미합니다.

내가이 종료 날짜의 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 바이올린을 만들었습니다.

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

어떻게 SQLFiddle에 주어진 데이터로부터 다음과 같은 결과를 생성하는 내 의지로 2008 SQL 서버를 구부릴 수 있습니까?

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

해결법

  1. ==============================

    1.그것은 조금 추한하지만 NULL을 당신에게 특별한 의미를 가지고 있기 때문에, 이것은 내가 그것을 할 생각할 수있는 가장 깨끗한 방법입니다 :

    그것은 조금 추한하지만 NULL을 당신에게 특별한 의미를 가지고 있기 때문에, 이것은 내가 그것을 할 생각할 수있는 가장 깨끗한 방법입니다 :

    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이있는 경우 즉, 우리는 대답 할 것을 강제하고 싶다. 행이는 NULL을 포함하지 않는 경우에만 우리는 MIN (또는 MAX)를 반환해야합니다.

  2. ==============================

    2.당신이 원하는 효과가 완료되면 다시 NULL 함께 다음 가장 큰 가능한 날짜로 NULL 치료를 대체하는 것입니다 :

    당신이 원하는 효과가 완료되면 다시 NULL 함께 다음 가장 큰 가능한 날짜로 NULL 치료를 대체하는 것입니다 :

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

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

  3. ==============================

    3.ENDDATE 열이 null가 아닌 경우 얼마나 많은 행 내 표현에서, (ENDDATE) 수를 계산합니다. 카운트 (*) 식 수는 행을 총. ENDDATE 열에서 값이 null이 포함 된 경우 비교하면 쉽게 알 수 있습니다. 그들이 동일하면, (ENDDATE)을 최대 결과이다. 그렇지 않은 경우는 대답은 널 (null)을 반환로 설정됩니다. 이것은이 정확한 검사를 할 수있는 매우 인기있는 방법입니다.

    ENDDATE 열이 null가 아닌 경우 얼마나 많은 행 내 표현에서, (ENDDATE) 수를 계산합니다. 카운트 (*) 식 수는 행을 총. ENDDATE 열에서 값이 null이 포함 된 경우 비교하면 쉽게 알 수 있습니다. 그들이 동일하면, (ENDDATE)을 최대 결과이다. 그렇지 않은 경우는 대답은 널 (null)을 반환로 설정됩니다. 이것은이 정확한 검사를 할 수있는 매우 인기있는 방법입니다.

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

    4.사용 ISNULL

    사용 ISNULL

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

    나는 MAX의 두 번째 명령에 MIN을 수정 한

  5. ==============================

    5.주어진 recordId를 위해 종료 날짜 컬럼에 널 (null)와 하나의 기록을 가지고 가정하면, 이런 일이 당신에게 원하는 출력을 제공한다 :

    주어진 recordId를 위해 종료 날짜 컬럼에 널 (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)
    
  6. ==============================

    6.분석적 기능을 사용 :

    분석적 기능을 사용 :

    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;
    
  7. ==============================

    7.난 당신이 원하는 수익을 포맷하는 두 개의 쿼리를 결합하는 조합을 사용하려고 :

    난 당신이 원하는 수익을 포맷하는 두 개의 쿼리를 결합하는 조합을 사용하려고 :

    SELECT recordId를, STARTDATE, TMP로부터 ENDDATE  어디 ENDDATE가 null  노동 조합  SELECT는 MIN (STARTDATE), MAX (ENDDATE) TMP GROUP BY의 recordId를 FROM, recordId를

    하지만 성능에 큰 영향을 미칠 것이다 연합 (EU)의 아무 생각이 없다

  8. from https://stackoverflow.com/questions/21286215/how-can-i-include-null-values-in-a-min-or-max by cc-by-sa and MIT license