Oracle SQL: выберите максимум из двух подмножеств из таблицы - PullRequest
0 голосов
/ 28 июня 2018

У меня есть таблица в формате:

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 *' и даты. Я использовал Макс, но я получаю только дату, а не соответствующий код. Когда я использую рейтинг, я не смог получить второй код. Есть идеи?

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' 

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

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;
0 голосов
/ 28 июня 2018

Вы можете использовать стандартные оконные функции ANSI и условное агрегирование:

select customer,
       max(case when seqnum = 1 and code like 'a%' then code end) as code_a,
       max(case when seqnum = 1 and code like 'a%' then date end) as date_a,
       max(case when seqnum = 1 and code like 'b%' then code end) as code_b,
       max(case when seqnum = 1 and code like 'b%' then date end) as date_b
from (select t.*,
             row_number() over (partition by substr(code, 1, 1) order by date desc) as seqnum
      from t
     ) t
group by customer;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...