从游戏数据框中提取每个用户最近 n 个活跃天的数据 activity

Extracting data of recent n active days of every user from dataframe of gaming activity

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

Sample Data if you would like to work

table 中的每条记录都代表一个特定的用户在玩特定类型的游戏时花费了一些钱。因此,用户有可能某一天玩,而另一天不玩。

我想提取的是...activity 用户最近活跃的 n 天(假设 n 是 15)。为了清楚起见,我举个例子:假设一个 account_id 12345 的用户在 2020 年 9 月 16 日、17 日、18 日、19 日、25 日、26 日和 2020 年 10 月 8 日玩了一些游戏(没有他打的比赛并不重要,那些日子他至少打了一场比赛)。到目前为止,我所做的是提取该玩家最近一次上场日期(2020 年 10 月 8 日至 15 天前,即 2020 年 9 月 24 日)的 activity。因此,我将只获得玩家在 2020 年 9 月 25 日和 2020 年 10 月 8 日的游戏 activity。但我想要的是过去 15 个活跃日的 activity,其中包括 10 月 8 日2020 年和 9 月 16 日、17 日、18 日、19 日、25 日、26 日和之前的 8 个活动日(因为我想要 15 天,而我提到的日期数为 7)

我对过去 15 天 activity 的做法(我可能活跃或不活跃)是

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;

不需要连接。
您在 table aug.
中拥有所需的所有数据 使用 DENSE_RANK() window 函数 select 最近 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, 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 版本,没有 window 函数,创建此索引:

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