繁体   English   中英

DB2 Case Statement-如果最大值相同,则选择最小值

[英]DB2 Case Statement - select lowest value if same maximum value

我正在尝试在带case语句的db2中为以下情况编写一个sql。 根据特定的ID,我们必须找到最大数量,并用最大数量标记一个。 但是,如果存在两个相同的最大值,则需要考虑最低等级(依次为1,2,3,4,5,然后为0)。

因此,在以下示例中,max_amt_ind仅对于等级2应该为Y,对于等级0和1应该为N。

ID      RANK    AMT     MAX_AMT_IND
13786   0       6.11    N
13786   1       2.9     N
13786   2       6.11    Y

以下查询将等级0和等级2都标记为“ Y”。 我也尝试使用嵌套的case语句,但是找不到解决方案。 任何帮助将非常感激。

select a. id, a.rank,a. amt,b.max_amount,
case when a.amt=b.max_amount then 'Y'
            else 'N'
            end as max_amt_ind
from Table_1 a inner join 
( 
select id, max(amt) as max_amount from Table_1
where max_payer_ind is null and id=13786
group by id
) b on a. id=b. id 

先感谢您!

您可以使用row_number()进行此操作:

select id, rank, amt,
       (case when row_number() over (partition by id
                                     order by amt desc,
                                              (case when rank = 0 then 1 else 0 end, rank desc)
                                    ) = 1
             then 'Y'
             else 'N'
        end) as MAX_AMT_IND
from . . .;

我只是在最近的活动中才注意到此主题,但是由于显然还没有以可以接受的方式回答,因此我认为尽管OP的年龄已经很高,我还是会尝试一下。

忽略处理重复的max(amt)值(位于等级列值1到5之外,但发现其等级列值为0)的可能性,以下似乎是一种有效的解决方案至少两个测试用例(一个在OP中,另一个在评论中作为对答案的回应):

设定:

 create table table_1                     
 ( id        int                          
 , rank      dec(2)                       
 , amt       dec(5, 2)                    
 , max_payer_ind for mpi char default null
 )                                        
 ;
 insert into  table_1 values          
   ( 11786 , 0  ,    6.11  , default )
 , ( 11786 , 1  ,    6.11  , default )
 , ( 12786 , 0  ,    6.11  , default )
 , ( 12786 , 1  ,    6.11  , default )
 , ( 12786 , 2  ,    6.11  , default )
 , ( 13786 , 0  ,    6.11  , default )
 , ( 13786 , 1  ,    2.9   , default )
 , ( 13786 , 2  ,    6.11  , default )
 ;


来自OP的原始查询被修改为使用CASE表达式中的标量子选择[不是CASE语句]根据名为RANK的列分配所需的值; 使用原始示例包含三行id = 13786的两个不同AMT值,但添加第二个示例包含id = 11786的两行相等的AMT值,并添加第三个示例[在注释中描述,@ Niki 2014年11月7日[在20:19]],其中三行具有相同的AMT值,且id = 12786。

 select a.id, a.rank, a.amt, b.max_amount             
      , case a.rank when ( select min(nullif(rank, 0))
                           from table_1               
                           where id=a.id              
                             and amt=b.max_amount   ) 
                    then 'Y' else 'N'                 
        end as max_amt_ind                            
 from Table_1 a                                       
 inner join table                                     
      ( select id, max(amt) as max_amount             
        from Table_1                                  
        where max_payer_ind is null                   
          and id = a.id                               
        group by id                                   
      ) b                                             
   on a.id = b.id                                     
 -- report from above query follows:
       ID   RANK     AMT   MAX_AMOUNT  MAX_AMT_IND
   11,786     0     6.11       6.11         N     
   11,786     1     6.11       6.11         Y     
   13,786     0     6.11       6.11         N     
   13,786     1     2.90       6.11         N     
   13,786     2     6.11       6.11         Y     
   12,786     0     6.11       6.11         N     
   12,786     1     6.11       6.11         Y     
   12,786     2     6.11       6.11         N     

现在考虑到重复的max(amt)既是等级= 0,又是等级> 5,为了使指标具有分配意义,“我们需要考虑最低等级(按1的顺序, 2,3,4,5,然后是0)“,我为测试用例提供了以下附加数据,并对查询进行了以下修订:

 insert into  table_1 values          
   ( 17786 , 0  ,    6.11  , default )
 , ( 17786 , 1  ,    1.11  , default )
 , ( 17786 , 2  ,    2.11  , default )
 , ( 17786 , 3  ,    3.11  , default )
 , ( 17786 , 4  ,    4.11  , default )
 , ( 17786 , 5  ,    5.11  , default )
 , ( 17786 , 6  ,    6.11  , default )


查询更改为使匹配a.rank = 0 [使用IFNULL()]并消除将指示分配给超过5的等级的考虑[通过为标量子选择添加谓词rank<=5 ]:

 select a.id, a.rank, a.amt, b.max_amount                  
      , case a.rank when ifnull(                           
                         ( select min(nullif(rank, 0))     
                           from table_1                    
                           where id=a.id                   
                             and rank<=5                   
                             and amt=b.max_amount   ) , 0 )
                    then 'Y' else 'N'                      
        end as max_amt_ind                                 
 from Table_1 a                          
 inner join table                        
      ( select id, max(amt) as max_amount
        from Table_1                     
        where max_payer_ind is null      
          and id = a.id                  
        group by id                      
      ) b        
   on a.id = b.id
 -- report from above query follows:
       ID   RANK     AMT   MAX_AMOUNT  MAX_AMT_IND
   11,786     0     6.11       6.11         N     
   11,786     1     6.11       6.11         Y     
   17,786     0     6.11       6.11         Y     
   17,786     1     1.11       6.11         N     
   17,786     2     2.11       6.11         N     
   17,786     3     3.11       6.11         N     
   17,786     4     4.11       6.11         N     
   17,786     5     5.11       6.11         N     
   17,786     6     6.11       6.11         N     
   13,786     0     6.11       6.11         N     
   13,786     1     2.90       6.11         N     
   13,786     2     6.11       6.11         Y     
   12,786     0     6.11       6.11         N     
   12,786     1     6.11       6.11         Y     
   12,786     2     6.11       6.11         N     


因此,在以上结果中,我们没有使用重复的max(amt)值来指示等级= 6,但是最终我们得出了一种情况,即等级= 0可能实际上符合该指示; 也就是说,如果重复的max(amt)不在1到5的范围内,就永远不会有机会表明等级= 0-也就是说,如果我理解问题描述。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM