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

如果它选择 mac 或 dos,我并不大惊小怪,但它不能提供 3 行;因为我需要的是每行userid,具有最大日期和该组合的“一个”有效操作系统。所以 mac 或 dos 是有效的,但 win 不是(对于用户 132)。

由于它是作为更复杂查询的一部分的派生表,因此由于执行时间的原因,我需要使其尽可能干净和简单(源表大小为几十万行)。正如标签所暗示的那样,我仅限于 SQL Server 2000。

4

1 回答 1

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
于 2012-04-23T13:57:08.663 回答