powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Отобрать по 2 ученика с каждого класса с лучшим рейтингом
9 сообщений из 9, страница 1 из 1
Отобрать по 2 ученика с каждого класса с лучшим рейтингом
    #39846642
palladin600
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую коллеги,
подскажите пожалуйста, как отобрать не более двух учеников из каждого класса с максимальным рейтингом?
т.е. имеется таблица:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
--список учеников
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



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

п.с. здесь, из первого класса видно, что у двух учеников одинаковые баллы. Кто именно из них попадёт - неважно. Как будет рейтинг отсортирован сервером, так TOP 2 сверху и отобрать.
...
Рейтинг: 0 / 0
Отобрать по 2 ученика с каждого класса с лучшим рейтингом
    #39846645
londinium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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;
...
Рейтинг: 0 / 0
Отобрать по 2 ученика с каждого класса с лучшим рейтингом
    #39846647
palladin600
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
londinium,
дай бог здоровья создателям этого сайта и людям, которые здесь помогают.
...
Рейтинг: 0 / 0
Отобрать по 2 ученика с каждого класса с лучшим рейтингом
    #39846648
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть десятки способов сделать это. Вот к примеру два:

Код: sql
1.
2.
WITH CTE AS(SELECT N=ROW_NUMBER()OVER(PARTITION BY ClassRomm ORDER BY Rating DESC), * FROM @Pupils)
SELECT * FROM CTE WHERE N<=3;



Код: sql
1.
2.
3.
SELECT TOP(1) WITH TIES *
FROM @Pupils
ORDER BY (ROW_NUMBER()OVER(PARTITION BY ClassRomm ORDER BY Rating DESC)-1)/2;



Первый-то лучше, кажется.
...
Рейтинг: 0 / 0
Отобрать по 2 ученика с каждого класса с лучшим рейтингом
    #39846686
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще можно взять классы и через apply подтянуть учеников
...
Рейтинг: 0 / 0
Отобрать по 2 ученика с каждого класса с лучшим рейтингом
    #39846790
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
palladin600,

Код: sql
1.
2.
3.
select top (1) with ties *
from @Pupils
order by (ROW_NUMBER() over (partition by ClassRomm order by Rating desc) + 1) / 2
...
Рейтинг: 0 / 0
Отобрать по 2 ученика с каждого класса с лучшим рейтингом
    #39846943
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Minamoto
Код: sql
1.
order by (ROW_NUMBER() over (partition by ClassRomm order by Rating desc) + 1) / 2

А не проще делить на 3 и ничего не плюсить? 1 и 2 дадут при делении 0...
...
Рейтинг: 0 / 0
Отобрать по 2 ученика с каждого класса с лучшим рейтингом
    #39846995
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaMinamoto
Код: sql
1.
order by (ROW_NUMBER() over (partition by ClassRomm order by Rating desc) + 1) / 2

А не проще делить на 3 и ничего не плюсить? 1 и 2 дадут при делении 0...Тоже подходящий вариант )
...
Рейтинг: 0 / 0
Отобрать по 2 ученика с каждого класса с лучшим рейтингом
    #39847005
Anton1978rs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Используй группировку и top(2)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Отобрать по 2 ученика с каждого класса с лучшим рейтингом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]