2016-08-26 2 views
1

У меня есть база данных спортивных состязаний. Я хочу получить пятерку лучших исполнителей из каждого сезона для каждой команды. Так что в моем клубе пять команд.SQL Server - Как использовать несколько значений столбцов в разделе

У меня есть колонка, которая содержит сезоны (1990, 1991, 1992 и т.д.). У меня есть столбец, который содержит мои команды (team1, team2, team3 и т. Д.).

Так что я действительно хочу это:

1990 team1 Jones 
1990 team1 Smith 
1990 team1 Cross 
1990 team1 Billy 
1990 team1 Alex 

then 

1990 team2 Craig 
1990 team2 Alan 
... 

Что такое чувство, что мне нужно, это Еогеасп в пункте где, но я знаю, что это неправильно.

Если у меня нет предложения where, тогда он просто получает первую пятерку.

я могу сделать:

where team = team1 AND season = 1990 
where team = team1 AND season = 1991 
... 
where team = team3 AND season = 1990 

Но я должен сделать это вручную для каждого сезона и каждой команды. Я знаю, что должен быть лучший способ :)

+0

В своем вопросе отсутствует информация о том, как вы получаете лучших исполнителей даже в течение одного года/команды, поэтому трудно дать конкретный рабочий ответ, а не просто советы о том, что попробовать. Не могли бы вы добавить фактический запрос, который вы используете сейчас, и некоторые примеры данных, которые будут работать с ним? –

+0

Это проект, над которым я работаю дома, и я представил это с работы, поэтому у меня нет данных со мной. Спасибо, что нашли время ответить. – Yabbie

+0

Что определяет топ 5 исполнителей? – Paparazzi

ответ

-1

вы можете посмотреть в статье НАД

WITH CTE AS (
SELECT name, ROW_NUMBER() OVER(PARTITION BY season, team ORDER BY performance DESC) AS RN 
FROM table 
) 
SELECT name 
FROM CTE 
where RN<=5 

что-то вроде этого

+0

Выше запрос не работает в 2008 R2. Пожалуйста, бросьте немного света. – user3977281

+0

Я использую 2016. – Yabbie

+0

мой плохой, я сделал это слишком поздно прошлой ночью и забыл часть CTE – Traceur

4

Использование ROW_NUMBER() И Partition По: Partition By группирует ваши данные в заданном параметре и дает уникальный идентификатор.

Declare @tblTest AS Table 
(
    Id INT, 
    Season INT, 
    Team VARCHAR(50), 
    Name VARCHAR(50) 
) 

INSERT INTO @tblTest VALUES(1,2001,'Team1','Name1') 
INSERT INTO @tblTest VALUES(2,2001,'Team1','Name2') 
INSERT INTO @tblTest VALUES(3,2001,'Team1','Name3') 
INSERT INTO @tblTest VALUES(4,2001,'Team1','Name4') 
INSERT INTO @tblTest VALUES(5,2001,'Team1','Name5') 
INSERT INTO @tblTest VALUES(6,2001,'Team1','Name6') 
INSERT INTO @tblTest VALUES(7,2001,'Team1','Name7') 

INSERT INTO @tblTest VALUES(8,2002,'Team2','Name1') 
INSERT INTO @tblTest VALUES(9,2002,'Team2','Name2') 
INSERT INTO @tblTest VALUES(10,2002,'Team2','Name3') 
INSERT INTO @tblTest VALUES(11,2002,'Team2','Name4') 
INSERT INTO @tblTest VALUES(12,2002,'Team2','Name5') 
INSERT INTO @tblTest VALUES(13,2002,'Team2','Name6') 
INSERT INTO @tblTest VALUES(14,2002,'Team2','Name7') 

SELECT 
    Id , 
    Season , 
    Team , 
    Name 
FROM 
(
    SELECT 
     Id , 
     Season , 
     Team , 
     Name , 
     ROW_NUMBER() OVER(Partition BY Season,Team Order by Season,Team,Name) AS PartNo 
    FROM 
    @tblTest 
)X 
WHERE X.PartNo<6 
1

Вы можете использовать функции ранжирования, как ROW_NUMBER() с PARTITION BY пункта.

;WITH CTE AS (
      SELECT team,player,season 
        ROW_NUMBER() OVER(PARTITION BY team,season ORDER by Score DESC) as rnk 
      FROM sports_stats_table 
      ) 

SELECT team,player,season 
FROM CTE 
WHERE rnk <=5 
ORDER BY rnk desc,season,team 

Для оценки производительности, чтобы выбрать лучшие исполнитель я предполагаю, что столбец называется Score в таблице

2

Надеются, что это будет достаточно ваше требование. Просто замените «Table_A» на фактическое имя таблицы, которое у вас есть, и измените соответствующие имена столбцов.

;WITH TeamStat AS(
SELECT Season 
    ,Team 
    ,Names, PlayerScore 
    ,ROW_NUMBER() OVER (PARTITION BY (Season) ORDER BY PlayerScore) AS Orders 
FROM TABLE_A 
) 
SELECT * from TeamStat where Orders <=5 
1

Подготовка данных образца:

declare @Year table 
(
    Year int 
) 

insert @Year values (1990), (1991), (1992) 

declare @Team table 
(
    Team int, 
    Player varchar(10) 
) 

insert @Team values 
    (1, 'a'), 
    (1, 'b'), 
    (1, 'c'), 
    (1, 'd'), 
    (1, 'e'), 
    (1, 'f'), 
    (1, 'g'), 
    (2, 'p'), 
    (2, 'q'), 
    (2, 'r'), 
    (2, 's'), 
    (2, 't'), 
    (2, 'u'), 
    (2, 'v') 

declare @Player table 
(
    Id int identity, 
    Year int, 
    Team int, 
    Name varchar(10), 
    Score int 
) 
insert 
    @Player 
select 
    y.Year, 
    t.Team, 
    t.Player, 
    60 + cast(40 * rand(checksum(newid())) as int) as Score 
from 
    @Year as y 
cross join 
    @Team as t 
order by 1, 2, 3 

Образец данных:

| Id | Year | Team | Name | Score | 
|----|------|------|------|-------| 
| 1 | 1990 | 1 | a | 99 | 
| 2 | 1990 | 1 | b | 78 | 
| 3 | 1990 | 1 | c | 80 | 
| 4 | 1990 | 1 | d | 94 | 
| 5 | 1990 | 1 | e | 77 | 
| 6 | 1990 | 1 | f | 96 | 
| 7 | 1990 | 1 | g | 85 | 
| 8 | 1990 | 2 | p | 97 | 
| 9 | 1990 | 2 | q | 67 | 
| 10 | 1990 | 2 | r | 68 | 
| 11 | 1990 | 2 | s | 61 | 
| 12 | 1990 | 2 | t | 78 | 
| 13 | 1990 | 2 | u | 88 | 
| 14 | 1990 | 2 | v | 66 | 
| 15 | 1991 | 1 | a | 93 | 
| 16 | 1991 | 1 | b | 82 | 
| 17 | 1991 | 1 | c | 96 | 
| 18 | 1991 | 1 | d | 90 | 
| 19 | 1991 | 1 | e | 67 | 
| 20 | 1991 | 1 | f | 60 | 
| 21 | 1991 | 1 | g | 64 | 
| 22 | 1991 | 2 | p | 83 | 
| 23 | 1991 | 2 | q | 77 | 
| 24 | 1991 | 2 | r | 75 | 
| 25 | 1991 | 2 | s | 74 | 
| 26 | 1991 | 2 | t | 91 | 
| 27 | 1991 | 2 | u | 88 | 
| 28 | 1991 | 2 | v | 69 | 
| 29 | 1992 | 1 | a | 96 | 
| 30 | 1992 | 1 | b | 98 | 
| 31 | 1992 | 1 | c | 70 | 
| 32 | 1992 | 1 | d | 68 | 
| 33 | 1992 | 1 | e | 84 | 
| 34 | 1992 | 1 | f | 70 | 
| 35 | 1992 | 1 | g | 87 | 
| 36 | 1992 | 2 | p | 60 | 
| 37 | 1992 | 2 | q | 77 | 
| 38 | 1992 | 2 | r | 76 | 
| 39 | 1992 | 2 | s | 91 | 
| 40 | 1992 | 2 | t | 80 | 
| 41 | 1992 | 2 | u | 70 | 
| 42 | 1992 | 2 | v | 62 | 

Результат:

| Year | Team | Name | Score | 
|------|------|------|-------| 
| 1990 | 1 | d | 98 | 
| 1990 | 1 | b | 94 | 
| 1990 | 1 | c | 93 | 
| 1990 | 1 | g | 79 | 
| 1990 | 1 | f | 78 | 
| 1990 | 2 | q | 99 | 
| 1990 | 2 | r | 85 | 
| 1990 | 2 | t | 82 | 
| 1990 | 2 | v | 80 | 
| 1990 | 2 | s | 69 | 
| 1991 | 1 | c | 95 | 
| 1991 | 1 | f | 93 | 
| 1991 | 1 | a | 88 | 
| 1991 | 1 | g | 81 | 
| 1991 | 1 | b | 73 | 
| 1991 | 2 | r | 99 | 
| 1991 | 2 | u | 93 | 
| 1991 | 2 | t | 89 | 
| 1991 | 2 | p | 86 | 
| 1991 | 2 | v | 80 | 
| 1992 | 1 | e | 90 | 
| 1992 | 1 | g | 88 | 
| 1992 | 1 | f | 84 | 
| 1992 | 1 | a | 80 | 
| 1992 | 1 | b | 77 | 
| 1992 | 2 | p | 94 | 
| 1992 | 2 | t | 89 | 
| 1992 | 2 | v | 86 | 
| 1992 | 2 | u | 77 | 
| 1992 | 2 | q | 74 | 

Запрос:

; 
with 
sort as 
(
    select 
     row_number() over (partition by p.Year, p.Team order by p.Score desc) as RowId, 
     p.Year, 
     p.Team, 
     p.Name, 
     p.Score 
    from 
     @Player as p 
) 
select 
    s.Year, 
    s.Team, 
    s.Name, 
    s.Score 
from 
    sort as s 
where 
    s.RowId <= 5 
+1

Wow. Благодарим вас за подробный и ответный ответ и время :-) – Yabbie

Смежные вопросы