首页 > 解决方案 > Oracle SQL:从表中选择两个子集的最大值

问题描述

我有一个格式如下的表格:

Customer Code Date
Cust1    aa   '18-Mar-01'
Cust1    ab   '18-Apr-05'
Cust1    ac   '18-Feb-20'
Cust1    ba   '18-Mar-03'
Cust1    bb   '18-Apr-06'
Cust1    bc   '18-May-30'
Cust2    aa   '18-Jun-08'
Cust2    ab   '18-May-15'
Cust2    ac   '18-May-07'
Cust2    ba   '18-Apr-26'
Cust2    bb   '18-Jun-17'
Cust2    bc   '18-Mar-29'

我试图得到这个:

Customer Code1 Date        Code2 Date
Cust1    ab    '18-Apr-05' bc   '18-May-30'
Cust2    aa    '18-Jun-08' bb   '18-Jun-17'

我正在尝试获取最大代码“a*”和日期,以及“b*”和日期。我一直在使用 max 但我只得到日期而不是相应的代码。当我使用排名时,我无法获得第二个代码。有任何想法吗?

Select c1.cust_num, 
       c1.cust_stat, 
       p1.cs_code, 
       p1.cs_est_comp_date, 
       p1.cs_act_comp_date 
       (select max(t.Cust_Codes.cs_act_comp_date) 
        from t.Cust_Codes 
        where t.cust_code.cs_code in ('AA','A1','A2')) as c1date, 
       (select max(t.Cust_Codes.cs_act_comp_date) 
        from t.Cust_Codes 
        where t.cust_code.cs_code in ('BA','A0','B2')) as c2date, 
from t.Cust c1, 
     t.Cust_Codes p1 
Where c1.cust_num = p1.cust_num (+) 
  and c1.cust_stat = 'O' 

标签: sqloracle

解决方案


Oracle 有一个名为first_value.

with
  q as(
    select Customer, substr(Code, 1, 1) Ch,
      first_value(Code) over(
        partition by Customer, substr(Code, 1, 1) order by "Date" desc) Code,
      first_value("Date") over(
        partition by Customer, substr(Code, 1, 1) order by "Date" desc) "Date"
    from t
  )
select Customer,
  max(decode(ch, 'a', Code)) Code1, to_char(max(decode(ch, 'a', "Date")), 'rr-Mon-dd') Date1,
  max(decode(ch, 'b', Code)) Code2, to_char(max(decode(ch, 'b', "Date")), 'rr-Mon-dd') Date2
from q
group by Customer;

推荐阅读