1. ホーム
  2. sql

[解決済み] MAX CASE式で

2022-02-19 08:01:22

質問

以下のような表があります。

基準

IDごとに最新行のEndDateを取得 EndDateがNullの場合、Active EnddateがNULLでない場合、Closedとなる

テーブルA

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

Close"Closed"の顧客に対してElse条件を追加できますか?

どのように解決するのですか?

たぶん。

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

あるいは、終了日が未来で、それらのレコードをアクティブにする必要がある場合...

このアプローチでは、終了日がNULLのIDはまだアクティブでなければならず、終了日が未来のIDはまだアクティブでなければならないとします。

サブクエリは、クローズしていない、または終了日が未来であることに基づいて、quot;active" であるすべての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