最新连续输的 sql 统计

2021-01-27 22:34:01 +08:00
 lbmjsls1

有一个玩家,有输有赢,每局有记录,比如玩家 id 是 userid,输赢根据得分字段 score 正负判断,如何写一个 sql 语句统计最近的连续输的次数。

比如

userid score

12345 100

12345 -100

12345 100

统计出来是 0

userid score

12345 100

12345 -100

12345 -100

统计出来是 2

userid score

12345 -100

12345 100

12345 -100

统计出来是 1

3543 次点击
所在节点    MySQL
32 条回复
xuanbg
2021-01-27 23:30:08 +08:00
楼主你这个需求就触及 SQL 的盲区了……
RedBeanIce
2021-01-27 23:31:24 +08:00
正负这个。。。。。
no1xsyzy
2021-01-27 23:59:47 +08:00
如果有一个标记顺序的字段就行(比如自动编码)
大致思路是分两步查询,第一步查询最后一个 score > 0 在哪行,第二步查出在那行之后有几行
yzdobest
2021-01-28 00:05:31 +08:00
https://mp.weixin.qq.com/s/d0fdqAzCE9FopNWBcMSYnw
楼主可以参考下这篇文章
dswyzx
2021-01-28 01:34:11 +08:00
思路:先通过 max(time)来获取最后一条 score 小于 0 的数据,可获得临时表:userid lasttime count=1
然后 for 循环临时表数据处理 每一个 userid+lasttime 往前面 time 读 score<0 然后 count+1

另可以设计:如果这个功能要实时统计,不如加个字段作为连输次数字段,每次插入时读取上一条记录逻辑算一下,这样如果逻辑需要处理连输的人就读上一条即可
LLLYang
2021-01-28 08:40:39 +08:00
加个字段标记本局输赢情况不好么
weizhen199
2021-01-28 09:00:41 +08:00
lz 应该不是做统计的吧。

前台用的话 decode + open window 应该就可以了

慢的话,给 decode 列加上函数索引。
Rache1
2021-01-28 09:26:23 +08:00
用 Redis 的 BitMap 来做~
sarices
2021-01-28 09:26:59 +08:00
```sql
SELECT
userid,
count( CASE score>0 WHEN TRUE THEN 1 END ) AS victory,
count( CASE score<0 WHEN TRUE THEN 1 END ) AS failure
FROM
tablename
GROUP BY
userid;
```
gwbw
2021-01-28 09:55:42 +08:00
可能部分时序数据库有办法做,看看 timescaledb
liuzhen
2021-01-28 10:01:01 +08:00
这个需求和统计用户连续签到天数基本一致,网上能找到 sql
liprais
2021-01-28 10:07:08 +08:00
这个问题不就是在所有输的记录里面找到连续的么
bugmakerxs
2021-01-28 10:16:45 +08:00
select count(1) from user_score where userid=1 and id > (
select id from user_score where userid=1 and score > 0 order by id desc limit 1
)

内层找到 score>0 的最大 id
外层统计大于这个 id 的行数量
lbmjsls1
2021-01-28 10:30:41 +08:00
@sarices 这种方法不对,不是求历史连输的记录,是求最新连输的记录
lbmjsls1
2021-01-28 10:35:32 +08:00
@bugmakerxs 这种方法也不对,首先你应该说反了,找到最小的 id 或者小于最大的 id,另外,同样不能保证找到的这个 id 就是最后一条数据
lbmjsls1
2021-01-28 10:43:12 +08:00
@liuzhen 连续签到的也不行,连续签到的少了一个条件,也就是插入到数据库的数据肯定是有效的,可以使用判断连续了多少次,而输赢的是插入的数据有输的,有赢的,如果过滤掉其中的赢的,就是连续签到的问题,但是不符合我的需求
sarices
2021-01-28 10:49:43 +08:00
对的,tablename 是最新记录子查询就好了
@lbmjsls1
sarices
2021-01-28 10:50:42 +08:00
@lbmjsls1 如果你不会,创建一个最新记录的视图也行,tablename 改为视图名称
c6h6benzene
2021-01-28 10:54:45 +08:00
count over partition by 胜负 order by 时间也许可解
no1xsyzy
2021-01-28 11:00:26 +08:00
@lbmjsls1 #13 就是我 #2 的思路。
没反,是你僵掉了

就是 reversed takewhile,放 SQL 里就是 count before first not

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/749062

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX