MAX

2017-10-18 5 views
0

は、私は、以下の表があります終了日は[アクティブ 終了日がない場合はnullを閉じるMAX

テーブルAが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 

は、私が "クローズ" の顧客のためのElse条件を追加することはできますか?

+0

これはXY問題のようです。 IDの終了日がnullの場合(または終了日が過ぎていない場合はそのIDのすべてのレコードが有効になっていますか?そうでない場合は終了していますか?)(ID2の終了日はどうなりますか?合体でmaxをラップし、 'closed'を使用しましたか? – xQbert

+0

case _expression_、not statement。 – 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がnullの端を持っている場合、このアプローチは言います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

別の開始日を(これは質問で参照小さなデータセットで示される)が発行取得する前に確実に終了日の値を発行した開始日フィールドが、その後、簡単な解決策は、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