在MSSQL中分组,每组的前10行

时间:2016-04-16 12:01:46

标签: sql sql-server tsql

我有以下SQL查询,用于获取数据库中每个组的一些统计信息(AVG,MAX,MIN和COUNT)。表格是两个。团队和用户。每个团队都有很多用户。

SELECT t.id, AVG(u.Age) AS Average, MIN(u.Age) AS Minimum, MAX(u.Age) AS Maximum, COUNT(u.id) AS NumberOfUsers

FROM Teams t 

INNER JOIN Users u ON t.id = u.id

WHERE t.status IS NOT NULL

GROUP BY t.id

ORDER BY Average Desc

然而,表用户还有另一栏"经验"并且我希望根据该列为每个组中的前10个用户获取相同的统计信息。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

解决方案是使用row_number(),在这种情况下,我认为在子查询中:

SELECT t.id, AVG(u.Age) AS Average, MIN(u.Age) AS Minimum,
       MAX(u.Age) AS Maximum, COUNT(u.id) AS NumberOfUsers
FROM Teams t INNER JOIN
     (SELECT u.*,
             ROW_NUMBER() OVER (PARTITION BY id ORDER BY experience DESC) as seqnum
      FROM Users u
     ) u
     ON t.id = u.id  AND -- is this really the right join condition?
        seqnum <= 10
WHERE t.status IS NOT NULL
GROUP BY t.id
ORDER BY Average Desc;

我怀疑你的加入条件是错误的。我希望正确的连接条件使用u.TeamId而不是u.Id之类的东西。如果是这样,您需要将partition by列更改为与join列相同。

答案 1 :(得分:0)

Gordon Linoff的解决方案看起来很不错,你也可以考虑在ROW_NUMBER()上使用DENSE_RANK()或RANK()以获得更好的&#34;如果许多用户的经验可能相同,那就是现实的统计数据。