Самостоятельное объединение SQL с суммированием и тремя верхними столбцами - PullRequest
0 голосов
/ 21 апреля 2019

Попытка сделать много за один запрос.Не уверен, следует ли мне выполнять отдельные подзапросы или группу объединений.

Это выполняется в приложении базы данных SQL в Microsoft Azure.

Таблица / представление:

TourmamentID  INT
EventID INT
EventName NVARCHAR(50)
TeamID INT
TeamName NVARCHAR(50)
EventStart Datetime
TeamEnd Datetime
iscomplete bit

Вот пример данных из представления.

TournamentID, EventName, TeamName, EventStart, TeamEnd, iscomplete     
---------- --------  ----------  -------  ---------     -------    
1             E1           T1       sqldate     sqldate    1    
1             E2           T1       sqldate     sqldate    1    
1             E1           T2       sqldate     sqldate    1
1             E2           T2       sqldate     sqldate    1
1             E1           T3       sqldate     sqldate    1
2             E1           T1       sqldate     null       null
2             E1           T2       sqldate     sqldate    1
2             E2           T2       sqldate     sqldate    1
3             E1           T3       sqldate     null       null

Мне нужно показать набор результатов турнирной таблицы, в котором в качестве столбцов будет указано общее количество команд, которые завершили соревнование с тремя самыми быстрыми временами.,Лучше всего было бы указать название команды и время.

EventName,  NumberTeamscompleted,   1st             2nd           3rd    
E1           3                      Datediff (T1)    DateDiff (T3) DateDiff(T2)    
E2           2        

Запрос вернул бы результат только для одного турнира (где tournamentID = 1)

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

У меня также есть независимый запрос, который выполняет подсчет и группирование по порядку.чтобы получить сумму, но когда я пытаюсь объединить их, все разваливается.

1 Ответ

1 голос
/ 21 апреля 2019

Вы можете использовать условное агрегирование:

select tournamentid, teamname,
       count(*) as num_completed,
       max(case when seqnum = 1 then teamname end) as team_1,
       max(case when seqnum = 2 then teamname end) as team_2,
       max(case when seqnum = 3 then teamname end) as team_3
from (select t.*,
             row_number() over (partition by tournamentid, teamname
                                order by datediff(day, teamstart, teamend)
                               ) as seqnum
      from t
      where iscomplete = 1
     ) t
group by tournamentid, teamname;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...