sqlserver 按照某条件排序后分组统计

mssql 专栏收录该内容
8 篇文章 0 订阅

问题描述
–库名 USA_LogServer
–表名 Tbl_Room_BattleResultEx_Log
–字段名字 LogDate 日期时间,格式 2018-07-11 09:18:45.000
–字段名字 ID 玩家账号
–字段名字 personalAttack 攻击值
–每一条记录代表一个玩家 参与了一场战斗,这场战斗的时间 和 攻击值是多少
–我要的查询语句是,在指定的时间范围内 例如 2018-07-11 09:18:45.000 到 2019-07-11 09:18:45.000 期间 ,
–统计出每个玩家一共参与了多少场战斗,按时间顺序以10场战斗为一个基准,
–统计每10场战斗的攻击值累计加在一起是否达到50万或50万以上,举例,
–玩家abc 参与了31场战斗,1到10场达到50万次攻击值,10到20场达到50万次攻击值,
–但是剩下的11场没达到50万次,那么他达到要求的记录就是2次 ,
–查询出来的结果展示就是 ID + 满足这个每10场战斗累计攻击值达到过超过50万次的次数统计 + 战斗总场次 。
–那么就是 abc 2 31

分析主要是按照时间分组,然后对小组进行统计

  1. 个人觉得分组条件是比较精妙的思路
  2. 每10局算一组,且10局游戏是由玩家的登陆时间升序决定的,这里用到了row_number()over()的分组排序功能,统计出每个玩家的参与的总局数
  3. 然后按照10局一组统计,关键是分组条件id ,(sn-1)/10,ID是玩家ID账号,(sn-1)/10 ,恰好可以分组,1到10局整除后的结果都是0,11到20整除后的结果都是1,依此类推

select id,sum(case when personalAttack_total>500000 then 1 else 0 end ) as 达标次数,sum(cnt) as 总次数
from
(
select id,sum(cast(personalAttack as bigint)) as personalAttack_total,count(*)as cnt from
(
select top 100 percent id,logdate,personalAttack,row_number()over(partition by id order by logdate) as sn

from Tbl_Room_BattleResultEx_Log
where convert(char(23),cast(LogDate as datetime),21) between ‘2018-07-11 09:18:45.000’ and ‘2019-07-11 09:18:45.000’ --and isnumeric(personalAttack)=1
order by id, logdate
) a group by id ,(sn-1)/10
)
b group by id order by 达标次数 desc

–select *from Tbl_Room_BattleResultEx_Log where id=‘13875958050’

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值