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;