MAX带CASE表达式

时间:2017-10-18 17:42:12

标签: sql oracle

我有下表:

标准:

获取每个ID的最新行的EndDate 如果EndDate为null,则为Active 如果Enddate不为null,则为Closed

表A

function f( x, y, z )
  -- ...
end

f( b(), c() )

预期结果:

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

Sql代码:

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

我可以为“已关闭”的客户添加Else条件吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果StartDate字段在获得另一个StartDate之前可靠地发出EndDate值(这由问题中引用的小数据集指示),那么一个简单的解决方案是使用CASE语句可以检查是否存在NULL enddate给定的ID:

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