2016-02-02 2 views
0
+-------------------------+ 
| id date value comments | 
+-------------------------+ 
| 1 d1 10 c1  | 
| 1 d2 20 c2  | 
| 1 d3 30 c3  | 
| 2 d7 70 c4  | 
+-------------------------+ 

Хочет написать SQL для создания расплющить таблицу, которая выглядит следующим образом:SQL: использование макс/мин агрегатных функций с соответствующей записью

ид | max_value | date_of_max_value | min_value | date_of_min_value

+0

Какую базу вы используете? Пожалуйста, отметьте соответствующим образом. –

ответ

0

Большинство баз данных поддерживают функции окна, такие как row_number(). Это позволит вам решить эту проблему, используя условную агрегацию:

select id, max(value) as max_value, 
     max(case when seqnum_desc = 1 then date end) as date_max_value, 
     min(value) as min_value, 
     max(case when seqnum_asc = 1 then date end) as date_min_value 
from (select t.*, 
      row_number() over (partition by id order by value asc) as seqnum_asc, 
      row_number() over (partition by id order by value desc) as seqnum_desc 
     from t 
    ) t 
group by id; 
+0

Спасибо. Не могли бы вы объяснить, почему вам нужно было инкапсулировать «случай, когда seqnum_desc = 1, а затем конец даты» в макс и мин? Я искал только дату, соответствующую максимальному значению и минимальному значению соответственно? ваша помощь приветствуется. – toing

+0

@toing. , , Вот как работает условная агрегация. Эти выражения вытягивают значение 'date', где' value' является максимальным или минимальным. –

+0

Спасибо. Я немного поднял глаза. Я думаю, что меня выбрасывает использование «max» для условной агрегации даты. Было бы так же, если бы я получал полевые комментарии, соответствующие максимальному или минимальному значению? вы бы все еще использовали что-то вроде max (случай, когда seqnum_desc = 1, а затем конец комментариев)? Что делать, если я должен был поменять макс с мин? – toing

Смежные вопросы