Sql 如何查找聚合分组的列信息

Sql 如何查找聚合分组的列信息,sql,sql-server,sql-server-2000,max,derived-table,Sql,Sql Server,Sql Server 2000,Max,Derived Table,我在SQLServer2000上编写了一个复杂的查询,其中部分包含对派生表的连接。不幸的是,这个表没有准确地返回我想要的结果,因为底层数据与我期望的不同。假设数据如下所示: 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 US

我在SQLServer2000上编写了一个复杂的查询,其中部分包含对派生表的连接。不幸的是,这个表没有准确地返回我想要的结果,因为底层数据与我期望的不同。假设数据如下所示:

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

如果它选择mac或dos,我并没有太在意,但它不能给出3行;因为我需要的是每个
用户id
一行,其中包含一个最大日期和该组合的“a”有效操作系统。所以mac或dos是有效的,但win不是(对于用户132)

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

尝试以下操作:

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
试试这个:

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

因此,为了构建我的派生表,派生表需要一个派生表。我会试一试,希望在接下来的一两个小时内。谢谢你的回复,但那不行。恐怕是我的错,不过我的问题没有答对,我相信你的回答是正确的。将我的问题更新为我实际想问的问题,即我希望每个用户ID和日期有一行与这两个条件匹配的有效操作系统。最后对其进行了排序,此时真正的查询让我头疼。我所做的与您的答案类似,但将“OS”替换为“OS=MAX(OS)”。基本上是嵌套和重复我的原始逻辑。因此,为了构建我的派生表,派生表将需要一个派生表。我会试一试,希望在接下来的一两个小时内。谢谢你的回复,但那不行。恐怕是我的错,不过我的问题没有答对,我相信你的回答是正确的。将我的问题更新为我实际想问的问题,即我希望每个用户ID和日期有一行与这两个条件匹配的有效操作系统。最后对其进行了排序,此时真正的查询让我头疼。我所做的与您的答案类似,但将“OS”替换为“OS=MAX(OS)”。基本上是嵌套和重复我的原始逻辑。