MAX

2017-10-18 1 views
0

나는 아래 표가 : 종료 날짜가 다음 Active 종료 날짜가없는 경우는 null 다음 휴일MAX

TableA의가 null의 경우 ID 당 최신 행의

를 적어 종료 날짜 :

기준

StartDate  EndDate   ID 
    04/01/2017  06/30/2017  1 
    10/01/2017      1 
    11/01/2017  05/01/2017  2 

예상 결과 :

StartDate  EndDate   ID CurrentStatus 
    04/01/2017  06/30/2017  1  Active 
    10/01/2017      1  Active 
    11/01/2017  11/02/2017  2  Closed 

는 SQL 코드 :

SELECT * 
MAX(CASE WHEN CCP.ENDDATE IS NULL THEN 'Active' END) 
     OVER (PARTITION BY CCP.ID) AS CURRENT_STATUS 
FROM TABLEA CCP 

나는 "청산"고객을위한 그렇지 조건을 추가 할 수 있습니까?

+0

이것은 XY 문제 일 수 있습니다. 귀하의 목표는 어떤 ID의 끝 날짜가 null인지 (또는 아직 끝나지 않은 끝 날짜인지, 그 ID에 대한 모든 레코드가 활성화되어 있는지, 아니면 닫혀 있는지)를 찾는 것입니까? (예상 결과에서 Id2의 종료 날짜는 어떻게됩니까? 병합에서 최대 값을 랩핑하고 '닫힘'을 사용 했습니까? – xQbert

+0

대소 문자가 아닌 사례 _ 표현식. – jarlh

답변

0

미정 :

SELECT * 
coalesce(MAX(CASE WHEN CCP.ENDDATE IS NULL THEN 'Active' END) 
     OVER (PARTITION BY CCP.ID),'Closed') AS CURRENT_STATUS 
FROM TABLEA CCP 

또는 당신은 종료 날짜가 미래에 상황을 가지고 있고 당신은 어떤 ID가 널 끝이있는 경우

이 방법을 말한다 ... 활성화 될 레코드를 필요로하는 경우 어떤 ID의 종료일이 미래의 것이면 활성 상태 여야합니다. 계속 활성 상태 여야합니다.

하위 쿼리는 닫히지 않았거나 종료 날짜가 미래 임에 따라 "활성"인 모든 ID를 식별합니다. 그러한 레코드가 존재하면 우리는 모든 ID를 활성화 또는 폐쇄로 설정하는 경우를 사용합니다.

SELECT A1.StartDate 
    , A1.EndDate 
    , A1.ID 
    , case when A2.ID is not null then 'Active' Else 'Closed' end As currentStatus 
FROM TableA A1 
INNER JOIN (SELECT Distinct ID 
      FROM TableA 
      WHERE EndDate is null or EndDate>=Sysdate()) A2 
on A1.ID = A2.ID 
0

다른 STARTDATE (이이 질문에서 참조되는 작은 데이터 세트로 표시됩니다) 발행하기 전에 확실하게 종료 날짜 값을 발급 STARTDATE 필드는 다음 간단한 해결책은 CASE 문을 사용하는 경우 할 수있는 체크한다 경우 주어진 ID에 대해 NULL 종료 날짜가 존재합니다.

SELECT StartDate, EndDate, ID 
     ,CASE WHEN EXISTS (SELECT EndDate 
          FROM TABLEA T2 
          WHERE T2.ID = T1.ID AND T2.EndDate IS NULL) 
      THEN 'Active' 
      ELSE 'Closed' 
     END AS [Current Status] 
    FROM TABLEA T1