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 表达式的主要内容,如果未能解决你的问题,请参考以下文章

php写一个正则表达式 匹配逗号

CASE表达式

case表达式的用法

SQL基础教程(第2版)第6章 函数谓词CASE表达式:6-3 CASE表达式

《C程序设计语言》笔记 (十三) 参考手册5

c语言中case的意思和用法