我有一个名为xDays的表,如下所示:
╔══════════════╦═════════════════════════╦═══════╗
║ Project_Name ║ Date ║ Hours ║
╠══════════════╬═════════════════════════╬═══════╣
║ proj1 ║ 2015-03-06 00:00:00.000 ║ 2 ║
║ proj1 ║ 2015-03-05 00:00:00.000 ║ 3 ║
║ proj1 ║ 2015-03-04 00:00:00.000 ║ 0 ║
║ proj2 ║ 2016-03-03 00:00:00.000 ║ 1 ║
║ proj2 ║ 2016-03-04 00:00:00.000 ║ 0 ║
║ proj2 ║ 2016-03-05 00:00:00.000 ║ 0 ║
╚══════════════╩═════════════════════════╩═══════╝
对于总共Project_Name
大于Hours
的每个0
,我想仅返回该项目的最后一个Date
条目一年多以前,如果它超过0小时。
在上表中,select语句将返回proj1 | 2015-03-03 00:00:00.000
,因为它的总小时数是> 0(在这种情况下为5),这是最近的日期> 0个小时,发生在一年多以前。
现在我有:
select max(day), project_name
from xDays
where hours > 0
group by project_name, hours
having max(day) < dateadd(dd, -365, getdate())
order by project_name
这成功地给了我日期&gt;一年前和&gt; 0小时,但它不能给出最新的。
对于上面的例子,它会给出
2015-03-06 00:00:00.000 | proj1
2015-03-05 00:00:00.000 | proj1
我认为使用max(day)
不会为同一个项目返回多个日期?
答案 0 :(得分:2)
当你有多个&#34; group by&#34;字段,它组合在一起的组合。由于您按project_name和hours进行分组,因此只要两者不同,它就会形成一个单独的组。你看到的两行有不同的&#34;小时&#34;值。
因此,正如上面的评论中所表达的那样,如果您只想要一行,只需从group by子句中删除hours字段。