应用 MAX 值。然后根据 MAX Value Row 添加条件
Posted
技术标签:
【中文标题】应用 MAX 值。然后根据 MAX 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 时应用最大值
现在根据 MAX 值 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
子句,因为您希望Role
和HistID
列的值是最新日期值。
类似:
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 值。然后根据 MAX Value Row 添加条件的主要内容,如果未能解决你的问题,请参考以下文章
[AGC034D] Manhattan Max Matching
Excel 中的 MIN IF 和 MAX IF 返回 #VALUE 错误,即使是数组公式