在Where子句中使用带有MAX和Partition Over的Case When语句的SQL

问题描述 投票:0回答:1

我使用

case when
聚合函数内的
MAX()
表达式来获取 case when 语句的最大值。

但是我还需要过滤掉 where 子句中的最大值。我可以从 select 子句中的 case when 语句中获取最大日期,但似乎无法理解如何在 where 子句中过滤掉它。

我知道我可以做一个临时表并轻松过滤掉它,但我想挑战自己并一次完成这一切。

这是我的 SQL 语句 - 我想获取 ID 的最新状态日期,但我只想要最新状态日期 >= 2022/01/01 的那个。

我知道下面的方法不起作用,但我不确定如果不将其放入临时表中该怎么办。

SELECT 
    A1.ID, A1.STATUS, A1.DESCRIPTION,
    MAX(CASE 
            WHEN A1.DESCRIPTION IS NOT NULL
                 AND A1.STATUS = 'C'
                THEN A1.STATUS_DATE
                ELSE NULL
        END) OVER (PARTITION BY A1.ID) AS LATEST_STATUS_DATE,
FROM 
    myTable A1
WHERE 
    MAX(CASE 
            WHEN A1.DESCRIPTION IS NOT NULL
                    AND A1.STATUS = 'C'
                THEN A1.STATUS_DATE
                ELSE NULL
        END) OVER (PARTITION BY A1.ID) >= '20220101'
sql max case partitioning
1个回答
0
投票

您可以尝试

GROUP BY
HAVING

SELECT A1.ID, A1.STATUS, A1.DESCRIPTION,

    MAX(CASE WHEN A1.DESCRIPTION IS NOT NULL
                 AND A1.STATUS = 'C'
                 THEN A1.STATUS_DATE
             ELSE NULL
               END) AS LATEST_STATUS_DATE
                 
FROM myTable A1
GROUP BY A1.ID, A1.Status, A1.Description
HAVING MAX(CASE WHEN A1.DESCRIPTION IS NOT NULL
                 AND A1.STATUS = 'C'
                 THEN A1.STATUS_DATE
                 ELSE NULL
               END) >= '20220101'

这是否真正有效取决于数据的性质,以及

Status
Description
在给定的
ID
内是否在此表中保持一致。

© www.soinside.com 2019 - 2024. All rights reserved.