选择平均得分最高的前10名

时间:2013-04-25 12:02:51

标签: sql sql-server select join

让我们说,我有产品和分数表。

Product
-------
id
name

Score
-----
id
ProductId
ScoreValue

我想获得AVERAGE分数最高的前十大产品,我如何获得平均值并在一个选择陈述中选择前十大产品?

这是我的选择意外行

SELECT TOP 10 Product.ProductName Score.Score 
FROM Product, Score 
WHERE Product.ID  IN (select top 100  productid  
                       from score 
                       group by productid 
                       order by sum(score) desc) 
order by Score.Score desc

3 个答案:

答案 0 :(得分:4)

这可能会这样做

SELECT TOP 10 p.ProductName, avg( s.Score ) as avg_score
FROM Product p
    inner join Score s on s.product_id = p.product_id
group by p.ProductName, p.product_id
order by avg_score desc

答案 1 :(得分:2)

尝试一下,

WITH records
AS
(
    SELECT  a.ID, a.Name, AVG(b.ScoreValue) avg_score,
            DENSE_RANK() OVER (ORDER BY AVG(b.ScoreValue) DESC) rn
    FROM    Product a
            INNER JOIN Score b
                ON a.ID = b.ProductID
    GROUP   BY a.ID, a.Name
)
SELECT  ID, Name, Avg_Score
FROM    records
WHERE   rn <= 10
ORDER   BY avg_score DESC

我没有使用TOP的原因是因为它不会处理具有最高平均值的重复记录。但您可以改为使用TOP WITH TIES

答案 2 :(得分:2)

请尝试:

declare @Product as table (id int, name nvarchar(20))
declare @Score as table (id int, ProductID int, ScoreValue decimal(23, 5))

insert into @Product values (1, 'a'), (2, 'b'), (3, 'c')

insert into @Score values (1, 1, 25), (2, 1, 30), (3, 2, 40), (4, 2, 45), (5, 3, 3)

select 
    distinct top 2 name, 
    ProductID, 
    AVG(ScoreValue) over (partition by name) 
from @Product a inner join @Score b on a.id=b.ProductID
order by 3 desc

相应地更改您的表名和行数。