从游戏活动的数据框中提取每个用户最近n个活动日的数据

德龙ing子手

因此,首先,数据如下所示:

在此处输入图片说明

如果您想工作,请提供样本数据

表中的每条记录代表一个特定的用户以某种金额玩特定类型的游戏。因此,用户可能有一天可能玩而不是另一天。

我想提取的是...用户最近活动的n天的活动(假设n为15)。明确地说,我举一个例子:假设一个account_id为12345的用户在2020年9月16日,17日,18日,19日,25日,26日和2020年10月8日玩了一些游戏(他玩过的游戏都没有没关系,那几天他至少打了一场比赛)。到目前为止,我的工作是从该球员最近的比赛日期(2020年10月8日至15天,即2020年9月24日)中提取该球员的活动。因此,我将仅在2020年9月25日,26日和2020年10月8日拥有玩家的游戏活动。但是我想要的是过去15个活动日的活动,其中包括2020年10月8日和9月16,17,18之前的19、25、26和8个工作日(因为我要15天,而我提到的日期要计为7)

我最近15天的活动方式(我可能处于活动状态或处于非活动状态)是

WITH BASE AS( 
SELECT 
MAX(date) AS LastDate, 
account_id 
FROM aug 
GROUP BY account_id
) 
SELECT 
ga.account_id, 
ga.date
FROM aug GA 
JOIN BASE B ON b.account_id = ga.account_id 
WHERE ga.date >= DATE_SUB(b.LastDate, INTERVAL 15 DAY) 
  AND ga.date <= b.LastDate  

我无法将最近15天转换为最近15天有效。请给我指导。提前致谢 :)

福帕斯

不需要加入。
您在表中拥有了所需的所有数据aug
使用DENSE_RANK()窗口功能选择最近15个工作日中的行:

select account_id, date, Real_money, table_name
from (
  select *, dense_rank() over (order by date desc) dr
  from aug 
  where account_id = ?
) t
where dr <= 15 

更换?account_id您要搜索的内容。

如果想要所有account_ids的结果

select account_id, date, Real_money, table_name
from (
  select *, dense_rank() over (partition by account_id order by date desc) dr
  from aug 
) t
where dr <= 15 

对于3.25.0之前的SQLite版本(不带窗口功能),请创建以下索引:

CREATE INDEX aug_account_id_date ON aug(account_id, date);

并尝试:

select a.* from aug a
where a.date >= coalesce(
  (
    select distinct date 
    from aug
    where account_id = a.account_id
    order by date desc limit 14, 1
  ), '0000-00-00'
)

要么:

select a.* from aug a
where (select count(distinct date) from aug where account_id = a.account_id and date >= a.date) <= 15

参见演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章