#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;