尝试在一个查询中做很多事情。不确定我应该执行不同的子查询还是一组联接。
它正在Microsoft Azure上的SQL数据库应用程序上运行。
表/视图为:
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
)的结果
我已经在表上进行了自我联接,以获取多于一组的结果列,但我还没有能力使第二组成为每个事件第二快的列。
我还有一个独立的查询,该查询进行计数和分组,按顺序进行求和,但是当我尝试将它们合并时,一切都崩溃了。
答案 0 :(得分:1)
您可以使用条件聚合:
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;