2013-01-15 39 views
1

我遵循了許多關於從一組行中選擇MAX的建議的優秀建議。MAX在羣組上返回多個值,但具有相同的日期,但時間不同

我有一個歷史文件,我只想每個項目編號的頂部日期和評論。我從這個信息中創建了一個Boxi宇宙中的派生表。這一切都非常順利,但如果在同一天有兩個條目,但是時間不同,它們都會返回。這在隨後的報告中重複了該條目。有什麼方法可以使MAX命令下降到日期字段的時間級別?

數據庫是SQL Server 2005中

-------------的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 

回答

1

MAXDATETIME數據類型也顯然需要時間考慮,是不是有什麼不對您的查詢。問題是,您無法確保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 
+0

我試圖運行原始查詢和CTE,對於我而言,使用SQL2008和原始帖子中的示例數據,兩個查詢都會得到相同的結果。子查詢** SELECT MAX(Cre​​atedOn)FROM ReportHistory GROUP BY Projectno **確實返回正確的3行,並從我可以看到原始查詢應該工作。 – jpw

+0

@jpw它會爲發佈的數據返回相同的結果,但op很可能會使用更多的數據。如果在與另一個projectno創建的最大日期相同的日期創建了一個projectno行,那麼原始查詢將返回錯誤結果 – Lamak

+0

是的,現在我看到了該錯誤。 – jpw

0

查詢,如果沒有相同projectno具有相同的日期:

SQLFIDDLEExample

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 | 

查詢是否有相同的項目無wi同一日期:

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 
0

我認爲您在不同項目的日期相同時會收到副本。

例如,添加在您的數據(4,「準時」,「2013年1月8日11:01:00」) 那麼結果將是SQLFiddle

但是你需要這個結果SQLFiddle

SELECT * 
FROM ReportHistory t 
WHERE t.ItemName=('ProjectCode1') 
    AND EXISTS (
       SELECT 1 
       FROM ReportHistory        
       WHERE projectNo = t.projectNo 
       GROUP BY projectNo 
       HAVING MAX(CreatedOn) = t.CreatedOn 
      ) 
相關問題