SQL Group by query - требует вашего внимания - PullRequest
1 голос
/ 22 ноября 2011

Я застрял в запросе 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 ]

2 голосов
/ 22 ноября 2011

попробуйте следующее:

  Select [ProductID], [TypeID], [Rating] 
  from [tblTest] 
  WHERE [Rating] in 
  (
    SELECT MAX([Rating])
    from [test].[dbo].[tblTest]
    group by [TypeID] 
  )
1 голос
/ 22 ноября 2011
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
0 голосов
/ 22 ноября 2011

Я бы предпочел иметь только один 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

Результат покажет обе строки.

Если вы действительно хотите показывать только 1 строку для каждого продукта, и вам все равно, какой typeId будет отображаться. Вместо этого вы можете использовать этот 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)

Надеюсь, это может быть другой альтернативой.

0 голосов
/ 22 ноября 2011

используйте этот запрос

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

, и вы получите следующий результат

1   1   9
500 1   7
0 голосов
/ 22 ноября 2011
select IdentityId, ProductId, max(Rating)  from TABLENAME group by ProductId

Похоже, это работает, хотя я не уверен, насколько «законно» оставлять идентификационный идентификатор вне группы по предложению.(snap @ Bryan;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...