如何通过在sql中使用分区来获取最小值和最大值

时间:2021-04-15 07:16:14

标签: 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

根据我的逻辑,我如何获得最小和最大 util ,即 util 计算应该是以前日期的总和。我假设我需要使用 partition,但我仍然不确定。

提前致谢

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果我将您的问题解释为您想要 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;