假设有一个表,其中包含一些在执行期间可以接收不同状态的进程:
process process_status
╔════╦════════╗ ╔════╦════════════╦════════════╦═════════╗
║ id ║ name ║ ║ id ║ process_id ║ date ║ status ║
╠════╬════════╣ ╠════╬════════════╬════════════╬═════════╣
║ 1 ║ One ║ ║ 1 ║ 1 ║ 2018-10-10 ║ Start ║
║ 2 ║ Two ║ ║ 2 ║ 1 ║ 2018-10-15 ║ Running ║
║ 3 ║ Three ║ ║ 3 ║ 1 ║ 2018-10-30 ║ Running ║
╚════╩════════╝ ║ 4 ║ 1 ║ 2018-11-01 ║ Running ║
║ 5 ║ 1 ║ 2018-11-02 ║ Error ║
║ 6 ║ 1 ║ 2018-11-03 ║ Error ║
╚════╩════════════╩════════════╩═════════╝
如您所见,状态可以不同,每个状态可以接收多次。
我只对状态Running
和Error
. 现在我得到这样的记录:
select p.id, p.name from process p
join process_status ps
on p.id = ps.process_id
where ps.status = 'Running' or ps.status = 'Error';
结果,返回 5 行。三个带有 status Running
,两个带有 status Error
。
是否有可能以某种方式只返回 2 行?最先收到的Running
(如果有的话)和/或最先收到的Error
(如果有的话)?
理想情况下,返回Running
在某个日期或之后首次收到的所有进程,例如2018-10-16
OR第一个Error
在其他日期或之前收到的进程,例如2018-10-17
?
可能吗?
因此,理想情况下,我只需要满足此条件的进程:
╔══════╦════════╗
║ p.id ║ p.name ║
╠══════╬════════╣
║ 1 ║ One ║
╚══════╩════════╝
UPD
让我稍微解释一下我的任务:
现在在系统中,所有进程及其所有状态都被从数据库中提取出来Running
并且Error
(大约与我给出的查询),并且已经从代码的一侧搜索了那些已经收到第一个状态Running
或Error
不迟于的进程某个日期。
事实。每天启动大约 8-1 万个(有时更多)进程,它们的数量已经达到数千万。每个进程还接收大约 10,000 个状态。
目前没有性能问题,但我正在运行影响此代码的任务。在我看来,从数据库到应用程序有太多不必要的数据。因此,既然我无论如何都在重构这部分代码,我想让它更优化,即不是在代码中减去数百万个进程并从中选择几十个必要的进程,而是立即只返回这10个必要的进程,并且只与他们合作。
小提琴
如果“不迟于某个其他日期”确实是另一个,并且文本错误地包含相同的日期,那么