sql-server – 从win-loss-tie数据中获取条纹计数和条纹类型

前端之家收集整理的这篇文章主要介绍了sql-server – 从win-loss-tie数据中获取条纹计数和条纹类型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我为这个问题做了一个 SQL Fiddle,如果这让任何人都更容易.

我有各种各样的幻想体育数据库,我想弄清楚的是如何得出“当前连胜”数据(如果球队赢得了他们的最后2场比赛,则为’W2′,如果他们输了,则为’L1’他们在赢得前一场比赛后的最后一场比赛 – 如果他们将最近的比赛打成平局,则为’T1′.

这是我的基本架构:

CREATE TABLE FantasyTeams (
  team_id BIGINT NOT NULL
)

CREATE TABLE FantasyMatches(
    match_id BIGINT NOT NULL,home_fantasy_team_id BIGINT NOT NULL,away_fantasy_team_id BIGINT NOT NULL,fantasy_season_id BIGINT NOT NULL,fantasy_league_id BIGINT NOT NULL,fantasy_week_id BIGINT NOT NULL,winning_team_id BIGINT NULL
)

wins_team_id列中的NULL值表示该匹配的平局.

这是一个示例DML语句,其中包含6个团队的一些示例数据和3周的比赛:

INSERT INTO FantasyTeams
SELECT 1
UNION
SELECT 2
UNION
SELECT 3
UNION
SELECT 4
UNION
SELECT 5
UNION
SELECT 6

INSERT INTO FantasyMatches
SELECT 1,2,1,4,44,2
UNION
SELECT 2,5,5
UNION
SELECT 3,6,3,3
UNION
SELECT 4,45,2
UNION
SELECT 5,3
UNION
SELECT 6,6
UNION
SELECT 7,46,2
UNION
SELECT 8,3
UNION
SELECT 9,NULL

GO

这是一个所需输出的例子(基于上面的DML),我甚至无法开始弄清楚如何派生:

| TEAM_ID | STEAK_TYPE | STREAK_COUNT |
|---------|------------|--------------|
|       1 |          T |            1 |
|       2 |          W |            3 |
|       3 |          W |            3 |
|       4 |          T |            1 |
|       5 |          L |            2 |
|       6 |          L |            1 |

我尝试过使用子查询和CTE的各种方法,但我不能把它放在一起.我想避免使用游标,因为我可以拥有一个大型数据集以便将来运行它.我觉得可能有一种方法涉及表变量,这些变量以某种方式将这些数据连接到自身,但我仍在努力.

附加信息:可能会有不同数量的球队(6到10之间的任何偶数),每个球队每周的总比赛将增加1.关于我应该怎么做的任何想法?

解决方法

由于您使用的是sql Server 2012,因此可以使用几个新的窗口函数.
with C1 as
(
  select T.team_id,case
           when M.winning_team_id is null then 'T'
           when M.winning_team_id = T.team_id then 'W'
           else 'L'
         end as streak_type,M.match_id
  from FantasyMatches as M
    cross apply (values(M.home_fantasy_team_id),(M.away_fantasy_team_id)) as T(team_id)
),C2 as
(
  select C1.team_id,C1.streak_type,C1.match_id,lag(C1.streak_type,C1.streak_type) 
           over(partition by C1.team_id 
                order by C1.match_id desc) as lag_streak_type
  from C1
),C3 as
(
  select C2.team_id,C2.streak_type,sum(case when C2.lag_streak_type = C2.streak_type then 0 else 1 end) 
           over(partition by C2.team_id 
                order by C2.match_id desc rows unbounded preceding) as streak_sum
  from C2
)
select C3.team_id,C3.streak_type,count(*) as streak_count
from C3
where C3.streak_sum = 0
group by C3.team_id,C3.streak_type
order by C3.team_id;

SQL Fiddle

C1计算每个团队的streak_type并匹配.

C2找到match_id desc排序的前一个streak_type.

C3生成由match_id desc排序的运行总和streak_sum,保持0 a long,因为streak_type与最后一个值相同.

查询总结了streak_sum为0的条纹.

猜你在找的MsSQL相关文章