我有这张桌子:
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(明天是谁)不得展示。
答案 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