MYSQL获取最新的工作号码

时间:2015-02-06 20:46:10

标签: mysql greatest-n-per-group

我有这张桌子:

TableNumber(Int 0 to 25)|Name(varchar 100)|Project(varchar 15)|StartDate(Datetime)
1                       |David            |P1                 |'2015-02-06 08:00:00'    
2                       |Sebastien        |P2                 |'2015-02-06 08:00:00'    
1                       |David            |P4                 |'2015-02-06 12:00:00'    
2                       |Sebastien        |P3                 |'2015-02-07 08:00:00'

我希望在一天中为每个人获得最新的工作。

我想:

TableNumber(Int 0 to 25)|Name(varchar 100)|Project(varchar 15)|StartDate(Datetime)    
2                       |Sebastien        |P2                 |'2015-02-06 08:00:00'    
1                       |David            |P4                 |'2015-02-06 12:00:00'   

所以我想排除P3,因为它不是'2015-02-06',我想排除P1因为它不是David(它的P4)的最新工作。

请考虑NOW()在以下示例中返回'2015-02-06 15:00:00'。

以下是我的尝试:

SELECT * FROM MyTable WHERE DATEDIFF(startdate, NOW()) = 0 ORDER BY tablenum DESC;

但这只排除了P3

所以我尝试了这个:

SELECT * FROM MyTable AS p WHERE DATEDIFF(p.startdate, NOW()) = 0 AND TIMEDIFF(p.startdate, NOW()) = (SELECT MAX(TIMEDIFF(p2.startdate, NOW())) FROM MyTable AS p2 WHERE p2.startdate = p.startdate) ORDER BY tablenum DESC;

但它仍然不排除P1。

任何人都知道如何实现这一目标? BTW startdate将始终为圆形小时(08:00:00或12:00:00或22:00:00 ......)

更新

是的,因为不太清楚我想要什么,我会在这里澄清:

我需要知道每个人的最后一个项目。

所以在我的表中,我需要知道Sebastien在第2号表的P2上工作,David在第1号表的P4上工作。我不想要P1因为它不是David工作的最后一个项目(最后一个)项目我还包括他正在进行的项目)。我还想排除未来的一切,所以P3(明天是谁)不得展示。

1 个答案:

答案 0 :(得分:3)

以下查询将为您提供给定日期特定姓名的最早作业的日期/时间。在以下示例中,我假设您希望2015-02-06上每个用户的最早作业。

SELECT Name, min(StartDate)
FROM MyTable
WHERE StartDate >= '2015-02-06'
  AND StartDate < '2015-02-07'
GROUP BY Name

使用上述查询,您可以轻松获得最终解决方案:

SELECT t1.project, t2.name, t2.StartDate
FROM MyTable t1 INNER JOIN
   (SELECT Name, min(StartDate)
FROM MyTable
WHERE StartDate >= '2015-02-06'
  AND StartDate < '2015-02-07'
GROUP BY Name) t2 ON t1.Name = t2.Name AND t1.StartDate = t2.StartDate