最新连续输的 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

3592 次点击
所在节点    MySQL
32 条回复
no1xsyzy
2021-01-28 11:04:10 +08:00
@no1xsyzy
就是 reversed takewhile len,放 SQL 里就是 count after last not
换一下代码:
Given series X

X | reverse | takewhile _ => _.score > 0 | len
等效于
X | after (X | last _ => not _.score > 0) | len

但注意事务隔离级别,不可重复读会有问题。
no1xsyzy
2021-01-28 11:05:42 +08:00
草了,我还是把 < > 弄反了……

X | reverse | takewhile _ => _.score < 0 | len
等效于
X | after (X | last _ => not _.score < 0) | len
bugmakerxs
2021-01-28 11:10:48 +08:00
@lbmjsls1 你再捋一捋,我看了半天没懂你回复我的是什么意思。
bugmakerxs
2021-01-28 11:13:01 +08:00
@lbmjsls1 我这个 sql 应该没问题
liuzhen
2021-01-28 11:21:37 +08:00
@lbmjsls1 你这个需求为什么加个字段记录连续输 /赢次数,在插入输赢的时候做个判断上次是输 /赢,来累加这个字段的次数呢?
lbmjsls1
2021-01-28 11:51:28 +08:00
@sarices 我又试了一边,这个确实是不对的,你写几个测试例子试试
lbmjsls1
2021-01-28 11:52:50 +08:00
@bugmakerxs 这个思路是对的,我想反了,不过有情况不对,就是如果玩家全是输的,那么就没有最后一个 id,那么统计下来就是 0.
NeezerGu
2021-01-28 11:55:25 +08:00
hive 可以

窗口函数加个 if, 再 row_number() over() 一下应该能出来
dswyzx
2021-01-28 12:00:24 +08:00
@lbmjsls1 #27 判断 isnull 呀,不存在置为 0
sarices
2021-01-28 12:01:17 +08:00
@lbmjsls1 不好意思,没看清楚你的问题,以为是计算胜负而已,参照这篇文章,应该可以解决你的问题 https://blog.csdn.net/u013887008/article/details/89105994
kiracyan
2021-01-28 12:01:50 +08:00
从游玩记录里统计有点费事 直接在用户表加一个字段插入游玩记录的时候更新
bugmakerxs
2021-01-28 12:12:32 +08:00
@lbmjsls1 嗯,那就里边 sql 加个判断,如果为 null 则设置为 0 就好了。

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

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

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

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

© 2021 V2EX