2014-02-26 68 views
1

,我有以下數據:分組,並與領域聚集不需要它

| ID | Date | Code | 
-------------------------- 
| 1 | 26/02/14 | 10 | 
| 1 | 25/02/14 | 11 | 
| 1 | 24/02/14 | 10 | 
| 2 | 25/02/14 | 13 | 
| 2 | 24/02/14 | 11 | 
| 2 | 23/02/14 | 10 | 

所有我想要的是組由ID字段,並返回從日期字段的最大值(即最近)。所以,最終的結果應該是這樣的:

| ID | Date | Code | 
-------------------------- 
| 1 | 26/02/14 | 10 | 
| 2 | 25/02/14 | 13 | 

看來不過,如果我想在同一個查詢顯示「代碼」字段我也有團體或聚合它,以及...這是有道理的,因爲在其他人被分組/聚合後(即使在這種情況下不存在)之後,在該字段中可能存在多於一個的值。

我以爲我可以通過在子查詢中僅對這些字段執行GroupBy和Max來處理此問題,然後在該子查詢上執行聯接以引入「代碼」字段,我不想將其分組或集合:

SELECT Q.ID, Q.MaxOfDate, A.Code 
FROM 
    (SELECT B.ID, Max(B.Date) As MaxOfDate 
    FROM myTable As B 
    GROUP BY B.ID) As Q 
LEFT JOIN myTable As A ON Q.ID = A.ID; 

這不起作用,因爲它仍然只給我我開始的記錄的原始數量。

你如何做分組和聚合與你不一定要分組/彙總的領域?

+0

仍然太多記錄..但是我知道我的原始子查詢出了什麼問題:我應該在日期字段上'LEFT JOIN'。 –

回答

0

如果你想與馬克斯日期相關的代碼,你將不得不使用子查詢與頂部1,像這樣:

SELECT B.ID, Max(B.Date) As MaxOfDate, 
(select top 1 C.Code 
    from myTable As C 
    where B.ID = C.ID 
    order by C.Date desc, C.Code) as Code  
FROM myTable As B 
GROUP BY B.ID 
+0

我曾試過'FIRST'函數,但不幸的是它不能可靠地拾取我之後的「代碼」值。我需要「日期」字段的「MAX」找到的行的「代碼」值。 –

+0

@MattHall - 答案已更新。 – Aducci

+0

謝謝 - 也剛剛意識到爲什麼我的子查詢不會工作..需要左加入ID字段和日期字段。我會接受你的答案,如果其他人想要替代方案,請添加我的答案。 –

1

到我接受了答案一種替代方案:

SELECT Q.ID, Q.MaxOfDate, A.Code 
FROM 
    (SELECT B.ID, Max(B.Date) As MaxOfDate 
    FROM myTable As B 
    GROUP BY B.ID) As Q 
LEFT JOIN myTable As A ON (Q.ID = A.ID) AND (A.Date = Q.MaxOfDate); 

需要在日期字段以及ID字段上執行LEFT JOIN