Как получить минимальное и максимальное значение с помощью раздела в sql

#sql #postgresql

Вопрос:

 type      value        prod           date
a           20           2          2019-07-08
a           20           3          2019-07-08
b           30           2          2019-07-08
b           35           1          2019-07-08
a           40           4          2019-07-09
a           20           4          2019-07-09
b           32           3          2019-07-09
b           31           3          2019-07-09
b           30           2          2019-07-09
b           33           2          2019-07-09
b           12           1          2019-07-10
b           23           1          2019-07-10
b           20           2          2019-07-10
b           22           2          2019-07-10
 

Мой стол выглядит так:
Во-первых, я хочу получить результат prod / value в виде util для каждого типа, а также даты, но для каждого результата мне также нужно суммировать предыдущие даты.

Таким образом, мне также нужно знать минимальное и максимальное значение для каждого типа, а также дату.

Что я сделал до сих пор:

 select *, t1.value / t1.prod as util
select
   type, date, sum(value), sum(prod)
from table1
where true
   and event_date <= ‘2019-07-11’
group by type, date) t1
 

Как я могу получить минимальную и максимальную полезность по той логике, которая у меня есть, что расчет полезности должен быть суммой с предыдущих дат. Я предполагаю , что мне нужно использовать partition , но я все еще не уверен в этом.

Заранее спасибо

Комментарии:

1. Отредактируйте свой вопрос и предоставьте желаемые результаты. Ваше объяснение также довольно сложно понять, и ему не помогает наличие запроса, который не является синтаксически правильным.

Ответ №1:

Не уверен, что вы ищете это. Он дает вам минимальные, максимальные, суммарные значения value столбцов путем упорядочения по date и разбиения по type .

Проверьте это:

 drop table tmp_table10
create table tmp_table10
(

type nvarchar(5) null,
value float null,
prod nvarchar(255) null,
date nvarchar(255) null,

)

insert into tmp_table10

values('a',           '20'           ,2          , '2019-07-08'),
('a',           '20'           ,3          , '2019-07-08'),
('b',           '30'           ,2          , '2019-07-08'),
('b',           '35'           ,1          , '2019-07-08'),
('a',           '40'           ,4          , '2019-07-09'),
('a',           '20'           ,4          , '2019-07-09'),
('b',           '32'           ,3          , '2019-07-09'),
('b',           '31'           ,3          , '2019-07-09'),
('b',           '30'           ,2          , '2019-07-09'),
('b',           '33'           ,2          , '2019-07-09'),
('b',           '12'           ,1          , '2019-07-10'),
('b',           '23'           ,1          , '2019-07-10'),
('b',           '20'           ,2          , '2019-07-10'),
('b',           '22'           ,2          , '2019-07-10')


select
    *
,   max(value) over(partition by type order by date) maxValueByType
,   min(value) over(partition by type order by date) minValueByType
,   sum(value) over(partition by type order by date) sumValue

from tmp_table10
order by type, date
 

Ответ №2:

Если я истолкую ваш вопрос так, как вы хотите, совокупные минимальные и максимальные значения util которых рассчитываются следующим образом:

 select type, date, sum(value) / sum(prod) as util
from table1
where event_date <= ‘2019-07-11’
group by type, date;
 

Затем вы можете использовать оконные функции:

 select type, date, sum(value) / sum(prod) as util,
       min(sum(value) / sum(prod)) over (partition by type order by date) as min_running_util,
       max(sum(value) / sum(prod)) over (partition by type order by date) as max_running_util
from table1
where event_date <= ‘2019-07-11’
group by type, date;