programing

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

newstyles 2023. 4. 9. 21:14

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

타임스팬 데이터를 저장하는 테이블이 있습니다.테이블에는 다음과 같은 스키마가 있습니다.

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

각 레코드 ID의 시작일과 종료일을 계산하려고 합니다.그러면 최소 StartDate와 최대 EndDate가 됩니다.StartDate는 null이 아니기 때문에 걱정할 필요는 없지만 현재 실행 중인 시간 범위임을 나타내기 위해 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 Fidle을 만들었습니다.

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

SQL Server 2008을 SQLFiddle에 기재된 데이터에서 다음과 같은 결과를 얻으려면 어떻게 해야 합니까?

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

좀 못생겼지만 그 이유는...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).

원하는 효과는 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(*)expression은 총 행을 카운트합니다.이 값을 비교함으로써 쉽게 알 수 있습니다.enddate컬럼에 포함됨null같은 경우,max(enddate)결과입니다.그렇지 않으면case기본적으로 반환됩니다.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로 변경했습니다.

특정 레코드의 EndDate 열에 null이 있는 레코드가 1개뿐이라고 가정합니다.ID, 다음과 같은 것이 원하는 출력을 제공합니다.

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