应用最大值.然后根据最大值行添加条件



我有下表。当类别 ID = 每个 ID 201 时,我需要每个 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 分区。

当类别 ID = 201 时应用最大值

现在应用基于最大值行的条件

当角色 = 黄金且 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

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

我会这样做:

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

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

最新更新