我有以下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个用户获取相同的统计信息。
有什么想法吗?
答案 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;如果许多用户的经验可能相同,那就是现实的统计数据。