根据另一列的总和返回最大值(日期)

时间:2016-12-01 15:45:50

标签: sql-server

注意:这与我在这里的另一个问题Donut Chart

有关

我有一个名为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)不会为同一个项目返回多个日期?

1 个答案:

答案 0 :(得分:2)

当你有多个&#34; group by&#34;字段,它组合在一起的组合。由于您按project_name和hours进行分组,因此只要两者不同,它就会形成一个单独的组。你看到的两行有不同的&#34;小时&#34;值。

因此,正如上面的评论中所表达的那样,如果您只想要一行,只需从group by子句中删除hours字段。