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