【发布时间】:2025-12-13 04:05:02
【问题描述】:
我有 2 张桌子。
第一个保存作业详细信息,第二个保存这些作业运行的历史记录。第一个还包含每个客户的作业期,这是为同一客户运行下一个作业之前等待的最短时间。时间比较需要在第二张表的started_on字段上进行。
我需要找出接下来要运行的作业 ID。
架构
- job_details 表
CREATE TABLE `job_details` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`customer_id` varchar(128) NOT NULL,
`period_in_minutes` int(11) unsigned NOT NULL,
`status` enum('ACTIVE','INACTIVE','DELETED') DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- job_run_history 表
CREATE TABLE `job_run_history` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`job_id` int(10) unsigned NOT NULL,
`started_on` timestamp NULL DEFAULT NULL,
`status` enum('STREAMING','STREAMED','UPLOADING','UPLOADED','NO_RECORDS','FAILED') DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_job_id` (`job_id`),
CONSTRAINT `fk_job_id` FOREIGN KEY (`job_id`) REFERENCES `job_details` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
job_details 表的示例数据:
INSERT INTO `job_details` (`id`, `customer_id`, `period_in_minutes`, `status`)
VALUES
(1, 'cust1', 1, 'ACTIVE'),
(2, 'cust2', 1, 'ACTIVE'),
(3, 'cust3', 2, 'ACTIVE');
job_run_history 表的样本数据:
INSERT INTO `job_run_history`(`job_id`, `started_on`, `status`)
VALUES
(1, '2021-07-01 14:38:00', 'UPLOADED'),
(2, '2021-07-01 14:37:55', 'UPLOADED');
预期输出(在2021-07-01 14:38:56 运行时):
id
2,3
-
-
id => 1没有被选中,因为最后一个作业是在最后 1 分钟内开始的
-
-
-
id => 2DID 被选中,因为上一个作业开始于上一分钟之前
-
-
-
id => 3DID 被选中,因为它没有运行历史记录
-
我已经尝试过了,但是这与 start_time 的最大值相比无法比较,因此不起作用:
select jd.id, max(jrh.started_on) from job_details jd
left join job_run_history jrh on jrh.job_id=jd.id
where
jd.status='ACTIVE'
and (jrh.status is null or jrh.status not in ('STREAMING','STREAMED','UPLOADING'))
and (jrh.`started_on` is null or jrh.`started_on` < date_sub(now(), interval jd.`period_in_minutes`*60 second))
group by jd.id;
MySql 版本:5.7.34
有什么帮助吗?提前谢谢..
【问题讨论】:
-
从表中删除超出此任务的列。将数据样本添加为 INSERT INTO。为此数据提供所需的输出。并指定精确的 MySQL 版本。
-
谢谢@Akina。完成所需的更改。
标签: mysql sql join nested greatest-n-per-group