因此,首先,数据如下所示:
表中的每条记录代表一个特定的用户以某种金额玩特定类型的游戏。因此,用户可能有一天可能玩而不是另一天。
我想提取的是...用户最近活动的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_id
s的结果:
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] 删除。
我来说两句