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