SQL统计连续获胜的用户数

SQL统计连续获胜的用户数,sql,statistics,ansi-sql,Sql,Statistics,Ansi Sql,我对SQL相当陌生,一直在忙于一些小项目,以掌握如何将其用于大规模统计 我目前正在研究的问题只是计算一段时间内连续获胜的用户数量 给出了一个表格的格式 user_id,date_time,user_team,win_team ab542a,2018-01-02 18:45:25,team1,team1 ef72da,2018-01-02 08:20:01,team2,team1 f5c776,2017-12-30 15:25:25,team1,team2 5a278a,2018-01-01 14

我对SQL相当陌生,一直在忙于一些小项目,以掌握如何将其用于大规模统计

我目前正在研究的问题只是计算一段时间内连续获胜的用户数量

给出了一个表格的格式

user_id,date_time,user_team,win_team
ab542a,2018-01-02 18:45:25,team1,team1
ef72da,2018-01-02 08:20:01,team2,team1
f5c776,2017-12-30 15:25:25,team1,team2
5a278a,2018-01-01 14:27:15,team2,team2
ae346d,2018-01-01 14:27:15,team2,team2
2b13d8,2017-12-31 12:33:34,team1,team2
ace797,2018-01-02 08:20:01,team2,team2
ace797,2018-01-03 18:18:22,team1,team2
ab542a,2018-01-03 18:45:25,team1,team1
ef72da,2018-01-03 08:20:01,team2,team1
f5c776,2017-12-31 15:25:25,team1,team2
5a278a,2018-01-02 14:27:15,team2,team2
ae346d,2018-01-02 14:27:15,team2,team2
2b13d8,2018-01-01 12:33:34,team1,team2
ace797,2018-01-03 08:20:01,team1,team1
ace797,2018-01-04 18:18:22,team1,team1
ab542a,2018-01-04 18:45:25,team1,team1
ef72da,2018-01-04 08:20:01,team2,team1
f5c776,2018-01-01 15:25:25,team1,team2
5a278a,2018-01-03 14:27:15,team2,team2
ae346d,2018-01-03 14:27:15,team2,team2
2b13d8,2018-01-02 12:33:34,team1,team2
ace797,2018-01-04 08:20:01,team2,team2
ace797,2018-01-05 18:18:22,team1,team1
其中user是用户id,date是比赛日期,team是用户所代表的一方,winner是比赛中获胜的一方。我如何计算所有连续至少3次获胜的用户

此外,假设我还想在同一个表中跟踪正在进行的国际象棋、西洋双陆棋等游戏,是否可以在同一个查询中跟踪多个游戏中的连胜


在python中,这可以通过一个相对简单的用户ID循环来实现,但计算成本很高,而且可能无法很好地扩展

如果您希望用户连续获得至少3个胜利,可以使用如下窗口函数:

select count(distinct t.user)
from (select t.*,
             lead(date, 2) over (partition by user order by date) as date_2,
             lead(date, 2) over (partition by user, (case when team = winner then 'win' else 'lose' end
                                 order by date
                                ) date_same_2
      from t
      where date >= ? and date < ?
     ) t
where team = winner;

这样做的目的是根据两个条件检查用户的行,并将其提前2行。第一个是日期。第二个是当用户的团队是赢家时。如果这些都是相同的-并且当前行是一个获胜行-那么您在一行中有三个获胜。

用您正在使用的数据库标记您的问题。同时显示您想要的结果。另外,有点不清楚谁/什么是赢家,是用户还是团队?完成了。更清楚吗?这会吸引那些可能几天不玩但仍保持连胜的用户吗?@rfho_bdss。对这与日期之间的间隔无关,只与给定用户的行顺序有关。我一直在胡乱摆弄它,以了解此窗口是如何工作的,但无法找出这些语法错误。有什么想法吗?@rfho\u bdss。您需要MySQL 8.0或其他支持窗口功能的数据库。我现在倾向于使用。