Выбор максимального значения для столбца в Oracle - PullRequest
2 голосов
/ 01 февраля 2010

У меня есть таблица с такими данными

id    test_val    type_cd  
#-------------------------  
101   TEST22      M  
102   TEST23      M  
103   TEST01      M  
103   TEST01      H  
104   TEST02      M  
104   TEST02      H  
105   TEST03      H  

Я хотел бы получить max (id) для каждого type_cd и соответствующего ему test_val в выводе одной строки, как показано ниже.

Ожидаемый результат:

M_id  M_Test_Val   H_id   H_Test_Val  
#-----------------------------------
104   TEST02       105    TEST03  

Если мне нужно выбрать только max (id) для каждого type_cd, мой запрос будет выглядеть следующим образом

select max(case when type_cd='M' then max(id) else null end) as M_id,
       max(case when type_cd='H' then max(id) else null end) as H_id
from t1
group by type_cd;

Я не уверен, как получить test_val для max(id) для каждого type_cd.

Ответы [ 2 ]

1 голос
/ 01 февраля 2010

Это своего рода сценарий, когда аналитические функции вступают в свои права ....

select type_cd
       , id as max_id
       , test_val
from ( 
        select type_cd
               , id
               , test_val
               , rank () over (partition by type_cd order by id desc) as rank_id
        from your_table
     )
where rank_id = 1
/

редактировать

Приведенный выше запрос не удовлетворяет вашу потребность в одной строке. Сортировка этого запроса в CTE, как это, должна сделать это ...

with subq as 
    (    select type_cd
           , id as max_id
           , test_val
    from ( 
            select type_cd
                   , id
                   , test_val
                   , rank () over (partition by type_cd 
                                       order by id desc) as rank_id
            from your_table
         )
    where rank_id = 1 )
select m.id as m_id
       , m.test_val as m_test_val
       , h.id as h_id
       , h.test_val as h_test_val
from ( select * from subq where type_cd = 'M') m
     join ( select * from subq where type_cd = 'H') h 

/

0 голосов
/ 01 февраля 2010

Я написал код, как показано ниже, и он работает как положено.

select max(case when type_cd='M' then id else null end) as m_id,  
max(case when type_cd='M' then test_val else null end) as m_test_val,  
max(case when type_cd='H' then id else null end) as h_id,  
max(case when type_cd='M' then test_val else null end) as h_test_val  
from  
    ( select type_cd ,  
             id ,  
             test_val ,  
             rank () over (partition by type_cd order by id desc) as rank_id  
      from your_table )  
where rank_id = 1;  

Не уверен, что это оптимальный путь. Но работает так, как я хочу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...