MAX 带 CASE 表达式
Posted
技术标签:
【中文标题】MAX 带 CASE 表达式【英文标题】:MAX With CASE expression 【发布时间】:2017-10-18 17:42:11 【问题描述】:我有下表:
标准:
获取每个 ID 的最新行的 EndDate 如果 EndDate 为空,则为 Active 如果 Enddate 不为 null 则关闭
表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
我可以为“已关闭”的客户添加 Else 条件吗?
【问题讨论】:
这似乎是 XY 问题。您的目标是查找是否有任何 ID 的结束日期为空(或者可能尚未过去的结束日期,那么该 ID 的所有记录都处于活动状态?否则它们被关闭?(Id2 的结束日期在预期结果中发生了什么?将最大值包裹在一个合并中并使用“关闭”? 案例表达式,不是陈述。 【参考方案1】:也许:
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
【讨论】:
【参考方案2】:如果 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
【讨论】:
以上是关于MAX 带 CASE 表达式的主要内容,如果未能解决你的问题,请参考以下文章