如何连续赢得三场胜利

Abh*_*ngh 6 sql sql-server sql-server-2008

这是表格:

([TeamA],[TeamB],[Win],[date])

('KKR','HYD','KKR',1), 
('KKR','MUM','MUM',2), 
('RCB','HYD','HYD',3), 
('DEL','PUB','PUB',4), 
('RR','PUB','RR',4), 
('RR','DEL','RR',5),
('RCB','CSK','CSK',6),
('RR','CSK','RR',7),
('CSK','MUM','MUM',7),
('MUM','DEL','MUM',8),
('HYD','PUNE','PUNE',9),
('PUB','DEL','DEL',9),
('KKR','DEL','KKR',10),
('KKR','RCB','KKR',10)
Run Code Online (Sandbox Code Playgroud)

所要求的答案应该是连续3次获胜的球队和计数.这里例如RR和MUM连续三次获胜.KKR有3胜,但如果我们看到日期列不是连续3,那么KKR不应该在答案中,输出应该是

RR 1
MUM 1
Run Code Online (Sandbox Code Playgroud)

Luk*_*zda 3

我的方法(可能可以用更干净的方式完成):

\n\n
WITH cte AS\n(\n  SELECT TeamA AS team FROM #tab\n  UNION \n  SELECT TeamB FROM #tab\n), cte2 AS \n(\n  SELECT c.team\n      ,[opponent] = CASE WHEN c.team = t.teamA THEN t.teamB ELSE t.teamA END\n      ,t.[win]\n      ,t.[day]\n      ,[is_winner] = CASE WHEN c.team = t.[win] THEN 1 ELSE 0 END\n  FROM cte c\n  JOIN #tab t\n    ON c.team = t.teamA\n    OR c.team = t.teamB\n), cte3 AS\n(\n  SELECT team, [day], [is_winner],\n    r =  ROW_NUMBER() OVER (PARTITION BY team ORDER BY [day])\n  FROM cte2\n), cte4 AS\n(\n  SELECT team, Length = MAX(r) - MIN(r) + 1 \n  FROM (SELECT team, r\n          ,rn=r-ROW_NUMBER() OVER (PARTITION BY team ORDER BY r)\n        FROM cte3\n        WHERE is_winner = 1) a\n  GROUP BY team, rn\n)\nSELECT team, SUM(Length/3) AS [Number_of_hat_tricks] \nFROM cte4\nWHERE Length >= 3\nGROUP BY team;\n
Run Code Online (Sandbox Code Playgroud)\n\n

LiveDemo

\n\n

输出:

\n\n
\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x97\n\xe2\x95\x91 team \xe2\x95\x91 Number_of_hat_tricks \xe2\x95\x91\n\xe2\x95\xa0\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa3\n\xe2\x95\x91 MUM  \xe2\x95\x91                    1 \xe2\x95\x91\n\xe2\x95\x91 RR   \xe2\x95\x91                    1 \xe2\x95\x91\n\xe2\x95\x9a\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d\n
Run Code Online (Sandbox Code Playgroud)\n\n

怎么运行的:

\n\n
    \n
  • cte - 获取所有团队
  • \n
  • cte2 - 为每个团队找到对手并检查团队是否获胜
  • \n
  • cte3 - 添加连续数字
  • \n
  • cte4 - 计算每个岛的长度
  • \n
  • 最终 - 获得岛屿 >= 3 并将它们相加(整数除法用于将行中的 6 场胜利计为 2,将行中的 9 场胜利计为 3,...)
  • \n
\n\n

最后一个想法:

\n\n

最后一列中的值对于同一团队必须是唯一的:

\n\n
(\'RR\',\'CSK\',\'RR\',7)\n(\'CSK\',\'MUM\',\'MUM\',7)\n\nCSK vs RR - 7\nCSK vs MUM - 7\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用当前数据不可能以稳定的方式对其进行排序。所以它应该是日期和时间部分:

\n\n
CSK vs RR  2015-12-07 10:00\nCSK vs MUM 2015-12-07 21:00       -- now we know that it is the second match\n
Run Code Online (Sandbox Code Playgroud)\n