我在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
OR
237,lin,08/08/2002
132,mac,03/07/2002
如果它拿起mac或dos我不是真的很好,但它不能给3行;因为我需要的是每行userid
一行,最大日期和“a”有效的OS组合。所以mac或dos是有效的,但win不是(对于用户132)。
因为它是一个派生表,作为更复杂的查询的一部分,我需要保持它尽可能干净和简单,因为执行时间(源表的大小是几十万行)。正如标签所暗示的那样,我只限于SQL Server 2000。
答案 0 :(得分: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