从游戏数据框中提取每个用户最近 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。
因此,首先,数据如下所示:
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。