如何获取在首次访问后 60 天内多次访问网站的用户



我尝试使用自连接编写SQL代码,但我无法弄清楚出了什么问题:

SELECT a.user_id,
a.visit_dt
FROM   dataset1 a 
JOIN   dataset1 b ON a.user_id = b.user_id
AND abs(datediff(day, a.visit_dt, b.visit_dt)) < 60;

新数据集应仅包含user_ids及其第一个visit_dt的列表

JOIN就像俄罗斯套娃一样,你需要做A B B A (与A B A B相反(。

假设您的表只是data_set(并且没有发布表,它由您来确保您加入正确的列(:

SELECT * 
FROM data_set AS d1 
INNER JOIN data_set AS d2 ON (d2.id = d1.id)

您也忘记在查询中使用WHERE。只需先做一个SELECT *来测试你的INNER JOIN,然后优化你的WHERE子句。我不知道你的桌子设置,所以如果没有你发布代码,我就无法回答这个问题。

WHERE abs(datediff(day, a.visit_dt, b.visit_dt)) < 60;

也完全忽略那些说你需要为所有列名添加前缀的人;例如,使用id而不是user_id,尽管你的列至少使用两个单词。搜索引擎更喜欢 URL 中的破折号,因此请使用下划线作为 URL 之外的功能代码的通用删除器。通过确保命名约定消除查找/替换冲突(查找高级查找和替换(来完善编码策略后,这将有所帮助。充分利用别名(AS(,例如a1.id,您将有一些可靠的SQL可以使用。祝你好运!

使用lead()和其他窗口函数:

SELECT d.user_id, d.visit_dt
FROM (SELECT d.*,
LEAD(d.visit_dt) OVER (PARTITION BY d.user_id ORDER BY d.visit_dt) as next_visit_dt,
ROW_NUMBER() OVER (PARTITION BY d.user_id ORDER BY d.visit_dt) as seqnum
FROM dataset1 d
) d
WHERE seqnum = 1 AND
d.next_visit_dt < DATEADD(day, 60, d.visit_dt);

或者,使用EXISTS

select d.user_id, min(d.visit_dt)
from dataset d
group by d.user_id
having exists (select 1
from dataset d2
where d2.user_id = d.user_id and
d2.visit_dt > min(d.visit_dt) and
d2.visit_dt < dateadd(day, 60, min(d.visit_dt)
);

最新更新