跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 最新连续输的 sql 统计
未分類
16 1 月 2021

最新连续输的 sql 统计

最新连续输的 sql 统计

資深大佬 : lbmjsls1 8

有一个玩家,有输有赢,每局有记录,比如玩家 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

大佬有話說 (32)

  • 資深大佬 : xuanbg

    主你这个需求就触及 SQL 的盲区了……

  • 資深大佬 : RedBeanIce

    正负这个。。。。。

  • 資深大佬 : no1xsyzy

    如果有一个标记顺序的字段就行(比如自动编码)
    大致思路是分两步查询,第一步查询最后一个 score > 0 在哪行,第二步查出在那行之后有几行

  • 資深大佬 : yzdobest

    https://mp.weixin.qq.com/s/d0fdqAzCE9FopNWBcMSYnw
    主可以参考下这篇文章

  • 資深大佬 : dswyzx

    思路:先通过 max(time)来获取最后一条 score 小于 0 的数据,可获得临时表:userid lasttime count=1
    然后 for 循环临时表数据处理 每一个 userid+lasttime 往前面 time 读 score<0 然后 count+1

    另可以设计:如果这个功能要实时统计,不如加个字段作为连输次数字段,每次插入时读取上一条记录逻辑算一下,这样如果逻辑需要处理连输的人就读上一条即可

  • 資深大佬 : LLLYang

    加个字段标记本局输赢情况不好么

  • 資深大佬 : weizhen199

    lz 应该不是做统计的吧。

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

    慢的话,给 decode 列加上函数索引。

  • 資深大佬 : faqqcn

    用 Redis 的 BitMap 来做~

  • 資深大佬 : sarices

    “`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

    可能部分时序数据库有办法做,看看 timescaledb

  • 資深大佬 : liuzhen

    这个需求和统计用户连续签到天数基本一致,网上能找到 sql

  • 資深大佬 : liprais

    这个问题不就是在所有输的记录里面找到连续的么

  • 資深大佬 : bugmakerxs

    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

    @sarices 这种方法不对,不是求历史连输的记录,是求最新连输的记录

  • 主 資深大佬 : lbmjsls1

    @bugmakerxs 这种方法也不对,首先你应该说反了,找到最小的 id 或者小于最大的 id,另外,同样不能保证找到的这个 id 就是最后一条数据

  • 主 資深大佬 : lbmjsls1

    @liuzhen 连续签到的也不行,连续签到的少了一个条件,也就是插入到数据库的数据肯定是有效的,可以使用判断连续了多少次,而输赢的是插入的数据有输的,有赢的,如果过滤掉其中的赢的,就是连续签到的问题,但是不符合我的需求

  • 資深大佬 : sarices

    对的,tablename 是最新记录子查询就好了
    @lbmjsls1

  • 資深大佬 : sarices

    @lbmjsls1 如果你不会,创建一个最新记录的视图也行,tablename 改为视图名称

  • 資深大佬 : c6h6benzene

    count over partition by 胜负 order by 时间也许可解

  • 資深大佬 : no1xsyzy

    @lbmjsls1 #13 就是我 #2 的思路。
    没反,是你僵掉了

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

  • 資深大佬 : no1xsyzy

    @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

    草了,我还是把 < > 弄反了……

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

  • 資深大佬 : bugmakerxs

    @lbmjsls1 你再捋一捋,我看了半天没懂你回复我的是什么意思。

  • 資深大佬 : bugmakerxs

    @lbmjsls1 我这个 sql 应该没问题

  • 資深大佬 : liuzhen

    @lbmjsls1 你这个需求为什么加个字段记录连续输 /赢次数,在插入输赢的时候做个判断上次是输 /赢,来累加这个字段的次数呢?

  • 主 資深大佬 : lbmjsls1

    @sarices 我又试了一边,这个确实是不对的,你写几个测试例子试试

  • 主 資深大佬 : lbmjsls1

    @bugmakerxs 这个思路是对的,我想反了,不过有情况不对,就是如果玩家全是输的,那么就没有最后一个 id,那么统计下来就是 0.

  • 資深大佬 : NeezerGu

    hive 可以

    窗口函数加个 if, 再 row_number() over() 一下应该能出来

  • 資深大佬 : dswyzx

    @lbmjsls1 #27 判断 isnull 呀,不存在置为 0

  • 資深大佬 : sarices

    @lbmjsls1 不好意思,没看清楚你的问题,以为是计算胜负而已,参照这篇文章,应该可以解决你的问题 https://blog.csdn.net/u013887008/article/details/89105994

  • 資深大佬 : kiracyan

    从游玩记录里统计有点费事 直接在用户表加一个字段插入游玩记录的时候更新

  • 資深大佬 : bugmakerxs

    @lbmjsls1 嗯,那就里边 sql 加个判断,如果为 null 则设置为 0 就好了。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具