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

问题描述

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

enter image description here

Sample Data if you would like to work

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

我想提取的是...用户在最近有效的n天内的活动(假设n为15)。明确一点,我举一个例子:假设一个account_id为12345的用户在2020年9月16日,17日,18日,19日,25日,26日和2020年10月8日玩了一些游戏(没关系,那几天他至少打了一场比赛)。到目前为止,我的工作是从该球员最近的比赛日期(2020年10月8日至2020年15月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天有效。请给我指导。 在此先感谢:)

解决方法

如果我理解正确:

SELECT gab.*
FROM (SELECT ga.account_id,ga.date,DENSE_RANK() OVER (ORDER BY b.LastDate DESC) as seqnum
      FROM aug GA JOIN
           BASE b
           ON b.account_id = ga.account_id 
     ) gab
WHERE seqnum >= 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_id的结果:

select account_id,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

请参见demo

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...