2012-04-23 28 views
0

我在SQL Server 2000上編寫了一個複雜的查詢,其中部分包含連接到派生表上。由於底層數據與我預期的不同,這張表很不幸地沒有按照我的意願返回。說的數據是這樣的:如何查找聚合分組的列信息

USERID,OS,DATEINSTALLED 
237,win,01/01/1980 
237,dos,01/02/1978 
237,lin,08/08/2002 
132,win,03/03/1982 
132,dos,03/07/2002 
132,mac,03/07/2002 

然後我的查詢看起來像這樣:

SELECT USERID, DATEINSTALLED = max(DATEINSTALLED) 
FROM INSTALLATIONS 
GROUP BY USERID 

這會給出一個結果集的

237,08/08/2002 
132,03/07/2002 

但我需要的是一個結果集作者:

237,lin,08/08/2002 
132,dos,03/07/2002 

237,lin,08/08/2002 
132,mac,03/07/2002 

我不是真的fussed,如果它拿起mac或dos,但它不能給3行;因爲我需要的是每userid一行,最大日期和該組合的「a」有效操作系統。所以mac或dos是有效的,但win不是(用戶132)。

由於它是派生表作爲更復雜的查詢的一部分,我需要儘可能保持它儘可能乾淨和簡單,因爲執行時間(源表大小爲幾十萬行)。作爲暗示的標籤,我僅限於SQL Server 2000中

回答

4

試試這個:

SELECT USERID, OS, DATEINSTALLED 
FROM INSTALLATIONS 
JOIN (
    SELECT USERID, DATEINSTALLED = max(DATEINSTALLED) 
    FROM INSTALLATIONS 
    GROUP BY USERID 
) AS T 
ON INSTALLATIONS.USERID = T.USERID AND INSTALLATIONS.DATEINSTALLED = T.DATEINSTALLED 
+0

因此,爲了建立我的派生表,派生表將需要派生表。我會放棄這一點,希望在接下來的一兩個小時內完成。 – Paul 2012-04-23 14:02:15

+0

感謝您的回覆,但這不起作用。我擔心這個錯誤是我的錯,但是爲了不讓我的問題正確,我相信你的回答正確無誤。更新我的問題是我實際想要問的問題,我希望每個用戶ID有一行,並且與任何符合這兩個條件的有效操作系統進行約會。 – Paul 2012-04-23 14:27:51

+0

把它分類到最後,真正的疑問讓我頭痛。我所做的與您的答案類似,但用「OS = MAX(OS)」替換「OS」。基本上嵌套和重複我有的原始邏輯。 – Paul 2012-04-23 15:15:06