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

时间:2017-10-19 12:22:04

标签: sql oracle

我有下表。当CategoryID = 201 Per ID

时,我需要Date Per 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

我需要在查询中添加条件:当CategoryId = 201然后取MAX日期

预期产出:

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不为null然后"已批准"

其他"待定"

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

2 个答案:

答案 0 :(得分:0)

我会这样做:

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

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

答案 1 :(得分:0)

您不应该需要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