如何获得每个工作的每个阶段的最后一行?

时间:2020-11-12 19:51:04

标签: mysql

我花了很长时间试图解决这个问题,我需要过滤此表:

+----+-------+-------+
| id | jobID |stageID|
+----+-------+-------+
|  1 |     1 |     1 |
|  2 |     1 |     2 |
|  3 |     1 |     2 |
|  4 |     1 |     1 |
|  5 |     2 |     2 |
|  6 |     2 |     1 |
|  7 |     2 |     1 |
|  8 |     2 |     2 |
+----+-------+-------+

您看到每个作业都有很多不同阶段的行,我需要获取每个作业每个阶段的最后一行。

例如,看作业1。它有4行,每行都有一个给定的阶段。我需要获取该工作阶段的最后一个条目,即第3行和第4行。

因此对于整个表,我需要像这样获得第3、4、7和8行

+----+-------+-------+
| id | jobID |stageID|
+----+-------+-------+
|  3 |     1 |     2 |
|  4 |     1 |     1 |
|  7 |     2 |     1 |
|  8 |     2 |     2 |
+----+-------+-------+

我想我会发疯的。我尝试使用GROUP_BY,但它不对工作进行计数就对阶段进行了分组。 你能帮我吗?

1 个答案:

答案 0 :(得分:0)

这很简单:

select max(id) as id, jobID, stageID
from yourtable
group by jobID, stageID

如果需要选择其他信息,请将其用作子选择:

select yourtable.id, yourtable.jobID, yourtable.stageID, yourtable.other
from (
    select max(id) as id
    from yourtable
    group by jobID, stageID
) max_job_stage_ids
join yourtable using (id)

或使用IN(我发现这在可视化查询计划方面没有多大帮助,但有些人喜欢它):

select id, jobID, stageID, other
from yourtable
where id in (select max(id) from yourtable group by jobID, stageID)