怎么统计连续数据的个数

我这个帅逼 2018-05-25 08:45:06
现在有一个对战信息表, 表里存了玩家ID,胜负情况, 现在需要统计每一个玩家的连胜或者连败情况,有没有什么思路.

比方说如我的截图里玩家1两连胜,玩家2三连败,玩家3 三连胜,那么结果就返回下表这样的结果
...全文
1567 6 打赏 收藏 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
IT-WeiHan 2018-05-29
  • 打赏
  • 举报
回复
不好意思 前面没看完的你的题目 这边重新写一个

CREATE TABLE TestTable
    (`ID` int, `胜负` varchar(4))
;
    
INSERT INTO TestTable
    (`ID`, `胜负`)
VALUES
    (1, 'win'),
    (1, 'win'),
    (1, 'loss'),
    (1, 'loss'),
    (1, 'win'),
    (2, 'win'),
    (2, 'win'),
    (2, 'win'),
    (2, 'loss'),
    (2, 'loss'),
    (2, 'loss'),
    (3, 'win'),
    (3, 'win'),
    (3, 'win')
;

CREATE TABLE IF NOT EXISTS temp_table AS (
  select @rownum:=@rownum + 1 as sid
  ,t.* 
  from TestTable t
  ,(SELECT @rownum := 0) r
);

CREATE TABLE IF NOT EXISTS WinningStreak AS (
  select T1.* from temp_table T1
  left join temp_table T2 on T1.id = T2.id
    and T1.sid = T2.sid + 1 and T1.`胜负` = T2.`胜负`
  left join temp_table T3 on T1.id = T3.id
    and T1.sid = T3.sid - 1 and T1.`胜负` = T3.`胜负`
  where T2.sid is not null or T3.sid is not null
  order by T1.sid
);

CREATE TABLE IF NOT EXISTS SerailTable AS (
  select T1.*,T2.sid T2flag, T3.sid T3flag from WinningStreak T1
  left join WinningStreak T2
    on T1.sid = T2.sid + 1 and T1.`胜负` = T2.`胜负`
  left join WinningStreak T3
    on T1.sid = T3.sid - 1 and T1.`胜负` = T3.`胜负`
  order by T1.sid
);

CREATE TABLE IF NOT EXISTS RankTable AS (
  select @rownum:=@rownum + 1 as rank,T.* from (
    select * from  SerailTable
    where T2flag is not null and T3flag is null
    union all
    select * from  SerailTable
    where T2flag is null and T3flag is not null
  ) T,(SELECT @rownum := 0) r
  order by sid
);

select 
T1.id,T1.`胜负`,(T2.sid-T1.sid + 1) recode
from 
(select * from  RankTable where rank %  2 = 1) T1
left join (select * from  RankTable where rank % 2 = 0) T2
on T1.rank + 1 = T2.rank


## 得出id 1 先连赢两场接着连输两场
## ID 2 连赢三场接着连输三场
| id |   胜负 | recode |
|----|------|--------|
|  1 |  win |      2 |
|  1 | loss |      2 |
|  2 |  win |      3 |
|  2 | loss |      3 |
|  3 |  win |      3 |
满好玩的问题 你先看一下,有不懂的地方再问我
IT-WeiHan 2018-05-29
  • 打赏
  • 举报
回复

CREATE TABLE TestTable
    (`ID` int, `胜负` varchar(4))
;
    
INSERT INTO TestTable
    (`ID`, `胜负`)
VALUES
    (1, 'win'),
    (1, 'win'),
    (1, 'loss'),
    (1, 'win'),
    (2, 'win'),
    (2, 'win'),
    (2, 'win'),
    (2, 'loss'),
    (2, 'loss'),
    (2, 'loss'),
    (2, 'loss'),
    (2, 'loss'),
    (2, 'loss'),
    (3, 'win'),
    (3, 'win'),
    (3, 'win')
;

select 
ID,sum(
  case when `胜负` = 'win' then 1
  when `胜负` = 'loss' then -1
  else 0
  end
) recode
from TestTable
group by ID;

| ID | recode |
|----|--------|
|  1 |      2 |
|  2 |     -3 |
|  3 |      3 |
        
ACMAIN_CHM 2018-05-29
  • 打赏
  • 举报
回复
排序字段是什么?建议完整贴出例子。
kampoo 2018-05-29
  • 打赏
  • 举报
回复
用SQL-DML脚本貌似不易处理,可以考虑存储过程处理 或者 读取到程序中进行处理。
ACMAIN_CHM 2018-05-26
  • 打赏
  • 举报
回复
表中至少需要一个能用于排序的字段。
我这个帅逼 2018-05-26
  • 打赏
  • 举报
回复
引用 1 楼 ACMAIN_CHM 的回复:
表中至少需要一个能用于排序的字段。
嗯是的,已经按时间排好序了
代码下载链接: https://pan.quark.cn/s/90fbf78c3289 "1元云购"是一种依托互联网的购物方式,用户仅需投入微小的资金(一般为一元)便有机会赢取高价值商品。此类模式常借助抽奖机制来判定获胜者,从而吸引众多用户加入。"1元云购源代码"是承载该业务流程的程序代码,其用途在于搭建一个完整的1元云购系统。 在构建1元云购源代码的过程中,主要包含以下几个核心技术要点: 1. **数据库架构**:为了有效存储商品详情、用户资料、交易历史及开奖结果,必须设计科学合理的数据库框架。这包括商品数据表、用户信息表、订单记录表和开奖记录表等,确保数据的统一性与完整性。 2. **支付渠道对接**:1元云购平台需与第三方支付服务(例如支付宝、微信支付)进行对接,以实现用户的在线支付操作。这涉及API接口调用、交易状态同步、退款流程管理等环节。 3. **随机数生成策略**:抽奖过程的核心在于公平透明地选定获奖者,通常采用随机数生成策略来实现。该策略需保障每位参与者拥有相等的获奖机会,同时防止欺诈行为。 4. **用户界面开发**:卓越的用户体验是吸引参与者的关键因素。前端页面应兼具视觉吸引力与操作便捷性,清晰展示商品信息、购买步骤、中奖规范等,并提供用户注册、登录、查询订单等功能。 5. **服务器程序设计**:后端系统负责处理用户请求,如管理订单、计算中奖号码、更新数据库信息等。这部分通常采用PHP等服务器端技术实现,需应对并发访问与高负载情形。 6. **安全措施**:1元云购平台可能面临恶意攻击,例如SQL注入、XSS跨站脚本攻击等。因此,源代码需遵循安全编程准则,对用户输入进行过滤与校验,同时运用HTTPS等加密手段保障数据传输安全。 7. **...

57,062

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧