Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Отобрать по 2 ученика с каждого класса с лучшим рейтингом  [new]
palladin600
Member

Откуда: Minsk Power Station
Сообщений: 470
Приветствую коллеги,
подскажите пожалуйста, как отобрать не более двух учеников из каждого класса с максимальным рейтингом?
т.е. имеется таблица:
--список учеников
declare @Pupils table(ClassRomm int, [Name] nvarchar(10), Rating int)
insert into @Pupils(id,name)
select 1, N'Ваня', 7 union all
select 1, N'Петя', 7 union all
select 1, N'Жора', 8 union all
select 4, N'Даша', 5 union all
select 4, N'Маша', 2 union all
select 5, N'Таня', 7


и если из каждого класса брать по ученику, то на выходе должен выйти такой список:
ClassRoom №; 	Name; 	Rating
1, Жора, 8
1, Ваня, 7
4, Даша, 5
4, Маша, 2
5, Таня, 7

п.с. здесь, из первого класса видно, что у двух учеников одинаковые баллы. Кто именно из них попадёт - неважно. Как будет рейтинг отсортирован сервером, так TOP 2 сверху и отобрать.
7 авг 19, 21:33    [21944169]     Ответить | Цитировать Сообщить модератору
 Re: Отобрать по 2 ученика с каждого класса с лучшим рейтингом  [new]
londinium
Member

Откуда: Киев
Сообщений: 1096
USE master
GO

declare @Pupils table(ClassRomm int, [Name] nvarchar(10), Rating int)
insert into @Pupils(ClassRomm ,name,Rating)
select 1, N'Ваня', 7 union all
select 1, N'Петя', 7 union all
select 1, N'Жора', 8 union all
select 4, N'Даша', 5 union all
select 4, N'Маша', 2 union all
select 5, N'Таня', 7

--подскажите пожалуйста, как отобрать не более двух учеников из каждого класса с максимальным рейтингом?
SELECT X.ClassRomm,X.Name,X.RATING
FROM
(
SELECT P.CLASSROMM,P.NAME,P.RATING,
ROW_NUMBER()OVER(PARTITION BY P.CLASSROMM ORDER BY RATING DESC)AS XCOL
FROM @Pupils AS P
)AS X WHERE X.XCOL<=2;
7 авг 19, 21:40    [21944172]     Ответить | Цитировать Сообщить модератору
 Re: Отобрать по 2 ученика с каждого класса с лучшим рейтингом  [new]
palladin600
Member

Откуда: Minsk Power Station
Сообщений: 470
londinium,
дай бог здоровья создателям этого сайта и людям, которые здесь помогают.
7 авг 19, 21:57    [21944175]     Ответить | Цитировать Сообщить модератору
 Re: Отобрать по 2 ученика с каждого класса с лучшим рейтингом  [new]
iap
Member

Откуда: Москва
Сообщений: 46815
Есть десятки способов сделать это. Вот к примеру два:

WITH CTE AS(SELECT N=ROW_NUMBER()OVER(PARTITION BY ClassRomm ORDER BY Rating DESC), * FROM @Pupils)
SELECT * FROM CTE WHERE N<=3;


SELECT TOP(1) WITH TIES *
FROM @Pupils
ORDER BY (ROW_NUMBER()OVER(PARTITION BY ClassRomm ORDER BY Rating DESC)-1)/2;


Первый-то лучше, кажется.
7 авг 19, 22:00    [21944176]     Ответить | Цитировать Сообщить модератору
 Re: Отобрать по 2 ученика с каждого класса с лучшим рейтингом  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 32003
Блог
еще можно взять классы и через apply подтянуть учеников
7 авг 19, 23:33    [21944222]     Ответить | Цитировать Сообщить модератору
 Re: Отобрать по 2 ученика с каждого класса с лучшим рейтингом  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1011
palladin600,

select top (1) with ties *
from @Pupils
order by (ROW_NUMBER() over (partition by ClassRomm order by Rating desc) + 1) / 2
8 авг 19, 09:58    [21944371]     Ответить | Цитировать Сообщить модератору
 Re: Отобрать по 2 ученика с каждого класса с лучшим рейтингом  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19152
Minamoto
order by (ROW_NUMBER() over (partition by ClassRomm order by Rating desc) + 1) / 2
А не проще делить на 3 и ничего не плюсить? 1 и 2 дадут при делении 0...
8 авг 19, 13:12    [21944632]     Ответить | Цитировать Сообщить модератору
 Re: Отобрать по 2 ученика с каждого класса с лучшим рейтингом  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1011
Akina
Minamoto
order by (ROW_NUMBER() over (partition by ClassRomm order by Rating desc) + 1) / 2
А не проще делить на 3 и ничего не плюсить? 1 и 2 дадут при делении 0...
Тоже подходящий вариант )
8 авг 19, 14:07    [21944705]     Ответить | Цитировать Сообщить модератору
 Re: Отобрать по 2 ученика с каждого класса с лучшим рейтингом  [new]
Anton1978rs
Member

Откуда: https://brovpn.io/
Сообщений: 1
Используй группировку и top(2)
8 авг 19, 14:13    [21944716]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить