SQL Group by query - 需要你注意

时间:2011-11-22 06:03:26

标签: sql sql-server-2008

我被困在sql查询中。我有以下数据:

IdentityId  ProductId   TypeId   Rating
3           1             1      9
7           1             2      3
9           500           1      7
2           500           2      5
8           777           4      5
12          777           3      8
11          999           4      1

我需要每个产品的最大评级+我需要与该评级相关联的typeId。

因此,产品1具有最高等级9&相关的TypeId是1

产品500具有最高等级7&相关的TypeId是1

产品777的最高等级为8&相关的TypeId是3

产品999的最高等级为1&相关的TypeId是4

如下输出:

ProductId   TypeId   Rating
1           1        9
500         1        7
777         3        8
999         4        1

如果问题不明确,请问我。

感谢您宝贵的时间和救命。

5 个答案:

答案 0 :(得分:2)

尝试以下方法:

  Select [ProductID], [TypeID], [Rating] 
  from [tblTest] 
  WHERE [Rating] in 
  (
    SELECT MAX([Rating])
    from [test].[dbo].[tblTest]
    group by [TypeID] 
  )

答案 1 :(得分:1)

declare @T table
(
  IdentityId int,
  ProductId int,
  TypeId int,
  Rating int
)

insert into @T values  
(3,           1,             1,      9),
(7,           1,             2,      3),
(9,           500,           1,      7),
(2,           500,           2,      5),
(2,           777,           4,      5),
(12,          777,           3,      8),
(2,           999,           4,      1)

;with C as
(
  select ProductId,
         TypeId,
         Rating,
         row_number() over(partition by ProductID 
                           order by Rating desc) as rn
  from @T
)
select ProductId,
       TypeId,
       Rating
from C
where rn = 1
order by ProductId

答案 2 :(得分:0)

使用此查询

select *  from product where Rating in (
select max(Rating)  from product group by  ProductId )

您将获得以下结果

1   1   9
500 1   7

答案 3 :(得分:0)

我更喜欢只有一个这样的SQL

select *  
from product p1
where rating = (select max(Rating)  
                from product p2
                where p1.ProductId = p2.ProductId)

但是,如果您的数据类似于以下内容,则此SQL可以返回同一产品的多个结果:

IdentityId  ProductId   TypeId   Rating
3           1             1      9
7           1             2      9  // note: same max rating

结果将显示两行。

如果您确实只希望每个产品只显示一行,并且您不关心将显示哪种类型ID。您可以改用此SQL。

select p1.productId, max(p1.typeId), max(Rating)  
from product p1
where rating = (select max(Rating)  
                from product p2
                where p1.ProductId = p2.ProductId)
group by p1.productId

您可以将max(p1.typeId)更改为min(p1.typeId)

我希望这可能是另一种选择。

答案 4 :(得分:-1)

select IdentityId, ProductId, max(Rating)  from TABLENAME group by ProductId

这似乎有效,尽管我不确定将身份ID从group by子句中删除是多么“合法”。 (snap @ Bryan;)