sql - 重新分配作业跨日期运行
问题描述
我有一个表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 日运行,使它们更接近那些日子里每种作业类型的平均值。
解决方案
您可以使用窗口函数来获取每个作业类型的最小和最大日期,以及记录总数和组内每条记录的排名。使用此信息,您可以跨日期平均分配工作:
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
推荐阅读
- zabbix - Zabbix web 场景调试
- handlebars.js - 在车把模板中使用脚本文件中的数据
- ios - iOS 13.2 中的 NSLocalizedString 加载键返回键(其他 iOS 版本工作正常,为什么?)
- javascript - 如何从 xlsx 中提取带有单元格信息的图像?
- elasticsearch - LOGSTASH 中的多个 IF ELSE 条件与和操作员
- javascript - 在 express 中将数据传递给加载了 res.redirect 的视图
- oracle - 交互式报告中的 Apex 项目未正确显示
- python - 并非所有 ascii_lowercase 组合都生成
- python - 检查 git 上的 Python 包是否比本地更新
- python - Seaborn catplot 透明度定制