首页 > 解决方案 > 重新分配作业跨日期运行

问题描述

我有一个表run_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 日运行,使它们更接近那些日子里每种作业类型的平均值。

标签: sqlpostgresqldategroup-byquery-optimization

解决方案


您可以使用窗口函数来获取每个作业类型的最小和最大日期,以及记录总数和组内每条记录的排名。使用此信息,您可以跨日期平均分配工作:

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

对于您的示例数据,这会产生

编号 | 工作类型 | run_dt    
-: | :------- | :---------
 8 | 一个 | 2020-05-23
 6 | 一个 | 2020-05-23
 7 | 一个 | 2020-05-23
 4 | 一个 | 2020-05-24
 1 | 一个 | 2020-05-24
 5 | 一个 | 2020-05-24
 2 | 一个 | 2020-05-25
 3 | 一个 | 2020-05-25
16 | 乙| 2020-05-24
15 | 乙| 2020-05-24
11 | 乙| 2020-05-24
12 | 乙| 2020-05-24
13 | 乙| 2020-05-25
14 | 乙| 2020-05-25
 9 | 乙| 2020-05-25
10 | 乙| 2020-05-25

推荐阅读