如何在SQL Server中获取赛程表的唯一对阵记录?
在SQL Server中提取唯一赛事对阵记录
原始数据
假设你的赛程表表名为Schedule,数据如下:
| Team1 | Team2 |
|---|---|
| CSK | SRH |
| SRH | CSK |
| MI | RR |
| RR | MI |
| DC | MI |
需求目标
获取不区分主客场的唯一对阵记录(即A vs B与B vs A视为同一对阵),结果如下:
| Team1 | Team2 |
|---|---|
| CSK | SRH |
| RR | MI |
| DC | MI |
解决方案
方法1:统一对阵顺序+去重(简洁版)
通过字符串比较固定对阵双方的排列顺序,再用DISTINCT去重,直接得到唯一对阵:
SELECT DISTINCT CASE WHEN Team1 < Team2 THEN Team1 ELSE Team2 END AS Team1, CASE WHEN Team1 < Team2 THEN Team2 ELSE Team1 END AS Team2 FROM Schedule;
方法2:窗口函数保留原始对阵顺序
如果需要保留原始数据中某一方作为Team1的记录(比如优先保留首次出现的对阵顺序),可以用ROW_NUMBER()分组筛选:
WITH RankedMatches AS ( SELECT Team1, Team2, ROW_NUMBER() OVER ( PARTITION BY CASE WHEN Team1 < Team2 THEN Team1 ELSE Team2 END, CASE WHEN Team1 < Team2 THEN Team2 ELSE Team1 END ORDER BY Team1 -- 可根据需求调整排序规则,比如比赛时间 ) AS RowNum FROM Schedule ) SELECT Team1, Team2 FROM RankedMatches WHERE RowNum = 1;
大小写兼容处理
如果队名存在大小写差异(如CSK和csk),需统一大小写后再比较,避免误判为不同对阵:
SELECT DISTINCT CASE WHEN LOWER(Team1) < LOWER(Team2) THEN Team1 ELSE Team2 END AS Team1, CASE WHEN LOWER(Team1) < LOWER(Team2) THEN Team2 ELSE Team1 END AS Team2 FROM Schedule;
内容的提问来源于stack exchange,提问作者Naidson Hari
相关产品推荐
相关产品推荐

