[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.그것은 조금 추한하지만 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.당신이 원하는 효과가 완료되면 다시 NULL 함께 다음 가장 큰 가능한 날짜로 NULL 치료를 대체하는 것입니다 :
당신이 원하는 효과가 완료되면 다시 NULL 함께 다음 가장 큰 가능한 날짜로 NULL 치료를 대체하는 것입니다 :
SELECT RecordId, MIN(StartDate), NULLIF(MAX(COALESCE(EndDate,'9999-12-31')),'9999-12-31') FROM tmp GROUP BY RecordId
당신의 바이올린 당이 모든 조건에서 지정하는 정확한 결과를 반환합니다.
-
==============================
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.사용 ISNULL
사용 ISNULL
SELECT recordid, MIN(startdate), MAX(IsNull(enddate, Getdate())) FROM tmp GROUP BY recordid
나는 MAX의 두 번째 명령에 MIN을 수정 한
-
==============================
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.분석적 기능을 사용 :
분석적 기능을 사용 :
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.난 당신이 원하는 수익을 포맷하는 두 개의 쿼리를 결합하는 조합을 사용하려고 :
난 당신이 원하는 수익을 포맷하는 두 개의 쿼리를 결합하는 조합을 사용하려고 :
SELECT recordId를, STARTDATE, TMP로부터 ENDDATE 어디 ENDDATE가 null 노동 조합 SELECT는 MIN (STARTDATE), MAX (ENDDATE) TMP GROUP BY의 recordId를 FROM, recordId를
하지만 성능에 큰 영향을 미칠 것이다 연합 (EU)의 아무 생각이 없다
from https://stackoverflow.com/questions/21286215/how-can-i-include-null-values-in-a-min-or-max by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MySQL의에서 외래 키 열 이름 바꾸기 (0) | 2020.05.13 |
---|---|
[SQL] 합니까 SQL은 순서는 성능에 영향을 미칠 JOIN? (0) | 2020.05.13 |
[SQL] EF 핵심 엔티티 테이블 구조를 참조 카테고리 부모 ID 자체지도 (0) | 2020.05.13 |
[SQL] 기본 키 위반 오류 후 거래를 계속 (0) | 2020.05.13 |
[SQL] 업데이트 쿼리 내에서 SELECT를 사용하여 (0) | 2020.05.12 |