如何解决从游戏活动的数据框中提取每个用户最近n个活动日的数据
因此,首先,数据如下所示:
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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。