我被困在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
如果问题不明确,请问我。
感谢您宝贵的时间和救命。
答案 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;)