Sql 组上的最大值返回多个日期相同但时间不同的值

Sql 组上的最大值返回多个日期相同但时间不同的值,sql,sql-server,sql-server-2005,max,Sql,Sql Server,Sql Server 2005,Max,我遵循了这个网站上关于从一组行中选择最大值的许多优秀建议 我有一个历史文件,我只想要每个项目编号的顶部日期和注释。我正在根据这些信息在Boxi宇宙中创建一个派生表。一切都进行得很顺利,但如果同一天有两个条目,但时间不同,它们都会被返回。这将在后续报告中复制该条目。是否有办法使MAX命令下降到日期字段的时间级别 数据库是SQLServer2005 -------------用于派生表的Sql Select Projectno, Comment, CreatedOn from Repo

我遵循了这个网站上关于从一组行中选择最大值的许多优秀建议

我有一个历史文件,我只想要每个项目编号的顶部日期和注释。我正在根据这些信息在Boxi宇宙中创建一个派生表。一切都进行得很顺利,但如果同一天有两个条目,但时间不同,它们都会被返回。这将在后续报告中复制该条目。是否有办法使MAX命令下降到日期字段的时间级别

数据库是SQLServer2005

-------------用于派生表的Sql

Select
   Projectno, Comment, CreatedOn
from 
   ReportHistory
Where
   ReportHistory.ItemName=('ProjectCode1')
and
   CreatedOn in(Select max(CreatedOn) FROM ReportHistory group by Projectno)
-------------------示例数据库

Projectno     Comment             Created on

1             Started             2013-01-04 11:04:00
2             Late                2013-01-06 11:22:00
3             Late                2013-01-07 11:06:00
1             On Time             2013-01-08 11:01:00   *these two both get selected*
1             Late                2013-01-08 12:05:00   *these two both get selected*
3             Back on schedule    2013-01-08 14:20:00
2             Still overdue       2013-01-09 09:01:00

DATETIME
数据类型上的
MAX
显然会考虑时间,这不是查询的问题所在。问题在于您没有确保
CreatedOn
的最大值适用于正确的
ProjectNo
。您可以为此使用分析函数:

;WITH CTE AS
(
    SELECT  Projectno, 
            Comment, 
            CreatedOn,
            ROW_NUMBER() OVER(PARTITION BY ProjectNo ORDER BY CreatedOn DESC) RN
    FROM ReportHistory
    WHERE ReportHistory.ItemName = 'ProjectCode1'
)
SELECT Projectno, Comment, CreatedOn
FROM CTE
WHERE RN = 1

DATETIME
数据类型上的
MAX
显然会考虑时间,这不是查询的问题所在。问题在于您没有确保
CreatedOn
的最大值适用于正确的
ProjectNo
。您可以为此使用分析函数:

;WITH CTE AS
(
    SELECT  Projectno, 
            Comment, 
            CreatedOn,
            ROW_NUMBER() OVER(PARTITION BY ProjectNo ORDER BY CreatedOn DESC) RN
    FROM ReportHistory
    WHERE ReportHistory.ItemName = 'ProjectCode1'
)
SELECT Projectno, Comment, CreatedOn
FROM CTE
WHERE RN = 1

查询是否没有相同日期的相同项目编号:

SELECT h.Projectno,
       MAX(h.Comment) AS Comment,
       h.[Created on]
FROM ReportHistory h
WHERE h.[Created on] =(Select max(h2.[Created on])
                       FROM ReportHistory h2 
                       WHERE h2.Projectno = h.Projectno )
GROUP BY h.Projectno,
       h.[Created on]
ORDER BY h.Projectno

SELECT h.Projectno,
       h.Comment,
       h.[Created on]
FROM ReportHistory h
WHERE h.[Created on] =(Select max(h2.[Created on])
                       FROM ReportHistory h2 
                       WHERE h2.Projectno = h.Projectno )
ORDER BY h.Projectno
结果:

| PROJECTNO |          COMMENT |                     CREATED ON |
-----------------------------------------------------------------
|         1 |             Late | January, 08 2013 12:05:00+0000 |
|         2 |    Still overdue | January, 09 2013 09:01:00+0000 |
|         3 | Back on schedule | January, 08 2013 14:20:00+0000 |
查询是否存在相同日期的相同项目编号:

SELECT h.Projectno,
       MAX(h.Comment) AS Comment,
       h.[Created on]
FROM ReportHistory h
WHERE h.[Created on] =(Select max(h2.[Created on])
                       FROM ReportHistory h2 
                       WHERE h2.Projectno = h.Projectno )
GROUP BY h.Projectno,
       h.[Created on]
ORDER BY h.Projectno

查询是否没有相同日期的相同项目编号:

SELECT h.Projectno,
       MAX(h.Comment) AS Comment,
       h.[Created on]
FROM ReportHistory h
WHERE h.[Created on] =(Select max(h2.[Created on])
                       FROM ReportHistory h2 
                       WHERE h2.Projectno = h.Projectno )
GROUP BY h.Projectno,
       h.[Created on]
ORDER BY h.Projectno

SELECT h.Projectno,
       h.Comment,
       h.[Created on]
FROM ReportHistory h
WHERE h.[Created on] =(Select max(h2.[Created on])
                       FROM ReportHistory h2 
                       WHERE h2.Projectno = h.Projectno )
ORDER BY h.Projectno
结果:

| PROJECTNO |          COMMENT |                     CREATED ON |
-----------------------------------------------------------------
|         1 |             Late | January, 08 2013 12:05:00+0000 |
|         2 |    Still overdue | January, 09 2013 09:01:00+0000 |
|         3 | Back on schedule | January, 08 2013 14:20:00+0000 |
查询是否存在相同日期的相同项目编号:

SELECT h.Projectno,
       MAX(h.Comment) AS Comment,
       h.[Created on]
FROM ReportHistory h
WHERE h.[Created on] =(Select max(h2.[Created on])
                       FROM ReportHistory h2 
                       WHERE h2.Projectno = h.Projectno )
GROUP BY h.Projectno,
       h.[Created on]
ORDER BY h.Projectno

我认为当不同项目的日期相同时,您会收到副本

例如,添加您的数据(4,“准时”,“2013-01-08 11:01:00”) 那么结果将是

但你需要这个结果


我认为当不同项目的日期相同时,您会收到副本

例如,添加您的数据(4,“准时”,“2013-01-08 11:01:00”) 那么结果将是

但你需要这个结果


我试着运行原始查询和CTE,对我来说,使用SQL2008和原始帖子中的样本数据,两个查询产生相同的结果。Projectno从ReportHistory组中选择MAX(CreatedOn)子查询确实返回了正确的3行,并且从我所看到的情况来看,原始查询应该可以工作。@jpw它将为发布的数据返回相同的结果,但op很可能使用了更多的数据。如果某个projectno的行是在另一个projectno的最大创建日期的同一日期创建的,则原始查询将返回错误的结果。我尝试运行原始查询和CTE,对我来说,使用SQL2008和原始帖子中的示例数据,两个查询都会产生相同的结果。Projectno从ReportHistory组中选择MAX(CreatedOn)子查询确实返回了正确的3行,并且从我所看到的情况来看,原始查询应该可以工作。@jpw它将为发布的数据返回相同的结果,但op很可能使用了更多的数据。如果某个projectno的行是在另一个projectno的最大创建日期相同的日期创建的,则原始查询将返回错误的结果