SQL: использование агрегатных функций max/min со связанной записью

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

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

id | max_value | date_of_max_value | min_value | date_of_min_value

1 ответ

Большинство баз данных поддерживают оконные функции, такие как 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;
Другие вопросы по тегам