Sql 跨日期重新分发作业运行
我有一个表Sql 跨日期重新分发作业运行,sql,postgresql,date,group-by,query-optimization,Sql,Postgresql,Date,Group By,Query Optimization,我有一个表run\u schedule,它维护与特定作业运行相关的未来日期,如下所示 id job_type run_dt 1 A 2020-05-25 2 A 2020-05-25 3 A 2020-05-25 4 A 2020-05-25 5 A 2020-05-25 6 A 2020-05-24 7 A 2020-0
run\u schedule
,它维护与特定作业运行相关的未来日期,如下所示
id job_type run_dt
1 A 2020-05-25
2 A 2020-05-25
3 A 2020-05-25
4 A 2020-05-25
5 A 2020-05-25
6 A 2020-05-24
7 A 2020-05-24
8 A 2020-05-23
9 B 2020-05-25
10 B 2020-05-25
11 B 2020-05-25
12 B 2020-05-25
13 B 2020-05-25
14 B 2020-05-25
15 B 2020-05-24
16 B 2020-05-24
在我的例子中,每天按类型划分的工作数量变化很大,有些日子有偏差
select job_type, run_dt, count(*)
from run_schedule
group by job_type, run_dt
order by job_type;
job_type run_dt count
A 2020-05-23 1
A 2020-05-25 5
A 2020-05-24 2
B 2020-05-25 6
B 2020-05-24 2
在postgres中是否有任何方法可以重新分配作业运行日期(run\dt
列),使其更均匀地分布?理想情况下,我希望看到下面这样的分布
job_type run_dt count
A 2020-05-23 3
A 2020-05-25 3
A 2020-05-24 2
B 2020-05-25 3
B 2020-05-24 4
因此,我有效地重新安排了2个
A
类型的作业,它们原本计划在25日至23日运行,2个B
类型的作业在24日运行,使它们更接近这些天中每种作业类型的平均值。您可以使用窗口函数获取每种作业类型的最小和最大日期,以及记录总数和组内每个记录的排名。使用此信息,您可以在不同日期平均分配作业:
select
id,
job_type,
date(min_run_dt + (max_run_dt - min_run_dt + 1) * (rn - 1) / cnt * interval '1 day') run_dt
from (
select
t.*,
min(run_dt) over(partition by job_type) min_run_dt ,
max(run_dt) over(partition by job_type) max_run_dt,
count(*) over(partition by job_type) cnt,
row_number() over(partition by job_type order by run_dt) rn
from mytable t
) t
order by job_type, run_dt
对于示例数据,:
id | job_type | run_dt
-: | :------- | :---------
8 | A | 2020-05-23
6 | A | 2020-05-23
7 | A | 2020-05-23
4 | A | 2020-05-24
1 | A | 2020-05-24
5 | A | 2020-05-24
2 | A | 2020-05-25
3 | A | 2020-05-25
16 | B | 2020-05-24
15 | B | 2020-05-24
11 | B | 2020-05-24
12 | B | 2020-05-24
13 | B | 2020-05-25
14 | B | 2020-05-25
9 | B | 2020-05-25
10 | B | 2020-05-25
id |作业|类型|运行|dt
-: | :------- | :---------
8 | A | 2020-05-23
6 | A | 2020-05-23
7 | A | 2020-05-23
4 | A | 2020-05-24
1 | A | 2020-05-24
5 | A | 2020-05-24
2 | A | 2020-05-25
3 | A | 2020-05-25
16 | B | 2020-05-24
15 | B | 2020-05-24
11 | B | 2020-05-24
12 | B | 2020-05-24
13 | B | 2020-05-25
14 | B | 2020-05-25
9 | B | 2020-05-25
10 | B | 2020-05-25