我有下表:
标准:
获取每个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条件吗?
答案 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