应用 MAX 值。然后根据 MA​​X Value Row 添加条件

Posted

技术标签:

【中文标题】应用 MAX 值。然后根据 MA​​X Value Row 添加条件【英文标题】:Apply MAX value. Then add conditions based on the MAX Value Row 【发布时间】:2017-10-19 12:22:04 【问题描述】:

我有下表。当 CategoryID = 201 Per ID 时,我需要每个 ID 的 MAX

表A

ID    Date       CategoryID
 1     1/1/17        101
 1     1/2/17        201
 1     1/4/17        201
 1     1/5/17        301
 2     1/1/17        101
 2     5/1/17        201 

(工作)查询:

   ,MAX(TABLEA.DATE)  
    KEEP (DENSE_RANK LAST ORDER BY TABLEA.DATE)
    OVER (PARTITION BY ID)
    AS most_recent_dt

我需要在查询中添加一个条件:When CategoryId = 201 Then take the MAX Date

预期输出:

ID    Date    CatergoryId    Most_Recent_Dt
 1     1/1/17        101       1/4/17
 1     1/2/17        201       1/4/17
 1     1/4/17        201       1/4/17
 1     1/5/17        301       1/4/17
 2     1/1/17        101       5/1/17
 2     5/1/17        201       5/1/17

*编辑

现在我有了我的 MAX 线,我只需要添加基于 MAX 线的条件。

预期输出:

简而言之。

**按 ID 分区。

当 CategoryID = 201 时应用最大值

现在根据 MA​​X 值 ROW 应用条件

当 Role = Gold 且 HistID 不为空时,则“已批准”

其他“待处理”

ID   Date   CategoryID    Most_Recent_Dt    Role    HistId    Category
 1     1/1/17        101       1/4/17       Gold   (Null)      Approved
 1     1/2/17        201       1/4/17       Bronze   201       Approved
 *1     1/4/17        201       1/4/17       Gold     101       Approved
 1     1/5/17        301       1/4/17       Gold     101       Approved
 2     1/1/17        101       5/1/17       Gold    (Null)     Pending 
 *2     5/1/17        201       5/1/17       Bronze   101       Pending

【问题讨论】:

条件不满足时你想怎么办? 好问题:那么'未满足'。是否可以嵌入案例表达式,以便我可以控制何时不满足条件? 我已经更新了我的问题 【参考方案1】:

您应该不需要KEEP 子句(因为它与MAX 相同)并且可以这样做:

 MAX( CASE When CategoryId = 201 THEN TABLEA.DATE END )
   OVER (PARTITION BY ID)
   AS most_recent_201_dt

现在我有了我的 MAX 线,我只需要添加基于 MAX 线的条件。

Case When (Role = Gold And HistId IS NOT NULL) OR () THEN 'Approved' WHEN... THEN 'NotApproved' ELSE 'Pending' END AS Category

此时您可以使用KEEP 子句,因为您希望RoleHistID 列的值是最新日期值。

类似:

CASE
WHEN (
  MAX( CASE Role WHEN 'Gold' THEN Role END )
    KEEP ( DENSE_RANK LAST
           ORDER BY CASE WHEN CategoryId = 201 THEN TABLEA.DATE END NULLS FIRST )
    OVER ( PARTITION BY ID )
  = Role
  AND
  MAX( HistID )
    KEEP ( DENSE_RANK LAST
           ORDER BY CASE WHEN CategoryId = 201 THEN TABLEA.DATE END NULLS FIRST,
                    CASE Role WHEN 'Gold' THEN Role END NULLS FIRST )
    OVER ( PARTITION BY ID )
  IS NOT NULL
)
OR ( ... )
THEN 'Approved'
WHEN ...
THEN 'NotApproved'
ELSE 'Pending'
END

【讨论】:

谢谢,什么时候使用 Keep 条款? @JoJo 我有an explanation here,但是当您想首先按一组列过滤(KEEP 子句)然后只从一个列中获取最大值时,短版本是使用KEEP这些列(或不同的列)。 您也可以使用KEEP 和错误的FIRST/LAST 子句来出错;因此,如果您不需要它,请不要包含它。例如:MAX( col ) KEEP ( DENSE_RANK FIRST ORDER BY col ) 将获得保留值的最大值,但保留值是最小行,因此实际上将返回最小值(而不是最大值)。同样,MAX( col ) KEEP ( DENSE_RANK LAST ORDER BY col DESC ) 也会返回最小值(因为这次保留的行是按降序排列的)。 谢谢。我在询问中添加了其他条件。 @JoJo 已更新(我认为如果您填写 ... 部分,它会起作用,但它未经测试)【参考方案2】:

我会这样做:

MAX(CASE WHEN CategoryId = 201 THEN TABLEA.DATE END) OVER (PARTITION BY id) as most_recent_dt

也就是说,不要将此视为“第一值”计算。将其视为具有相同 id 的所有记录的(条件)最大值。

【讨论】:

以上是关于应用 MAX 值。然后根据 MA​​X Value Row 添加条件的主要内容,如果未能解决你的问题,请参考以下文章

匿名函数

[AGC034D] Manhattan Max Matching

Excel 中的 MIN IF 和 MAX IF 返回 #VALUE 错误,即使是数组公式

iPhonex s ma x 手机自带的视频软件有个显示但是点开又没有是怎么回事啊?

如果小于 Max,则通过消除最少用户将值除以其他值

将值映射到色标