获取一段时间后返回的用户

大家好,

我想获取在社区中 6 个月(last_seen_at)后回访的用户列表。

我知道我们可以从 users 表中获取 last_seen_at 日期。我可以比较这个时间戳,检查它是否大于 6 个月,并获取过去 6 个月未访问过的用户,但一旦有人访问社区,这个时间戳就会被当前日期时间覆盖,使得跟踪用户变得困难。

是否可以检查某人在上次访问后是否在一段时间后回到了论坛?

谢谢!

1 个赞

您需要的信息在 user_visits 表中。对我来说棘手的部分是从每个访问条目中减去上一次访问的值。这似乎需要一个窗口函数。根据 StackExchange 上这个问题的回复,LEAD 函数似乎可以解决这个问题。

试试这个查询,看看它是否返回了您需要的数据。它默认返回两次访问之间间隔超过 180 天的所有用户访问。可以通过设置查询的 days_away 参数来调整该值。

--[params]
-- integer :days_away = 180
WITH days_between_visits AS (
SELECT
user_id,
visited_at,
LEAD(visited_at) OVER (PARTITION BY user_id ORDER BY visited_at DESC) AS previous_visit,
visited_at - LEAD(visited_at) OVER (PARTITION BY user_id ORDER BY visited_at DESC) AS time_away
FROM user_visits
)

SELECT * FROM days_between_visits WHERE time_away >= :days_away
ORDER BY visited_at DESC

如果您发现返回的数据有任何问题,请告诉我。

6 个赞

太好了。我不知道这是否能满足 OP 的需求,但对我来说,\u003ex 天 就足够了。

太棒了,这里有所有会 SQL 的人,因为我太懒了,学不会那些技巧 :squinting_face_with_tongue:

3 个赞

非常感谢 @simon :100:
这完美满足了我的用例:100:
你真是个 SQL 魔法师 :mage:

3 个赞

您好 @simon

抱歉再次打扰您,能否请您在上面的 SQL 查询中返回 username 而不是 user_id?在 data-explorer 页面上,查询结果显示了用户名,但当我将结果导出为 CSV 文件时,用户名被替换为其 user_id。我希望 CSV 文件中也包含姓名。

谢谢

当然,试试这个:

--[params]
-- integer :days_away = 180
WITH days_between_visits AS (
SELECT
user_id,
visited_at,
LEAD(visited_at) OVER (PARTITION BY user_id ORDER BY visited_at DESC) AS previous_visit,
visited_at - LEAD(visited_at) OVER (PARTITION BY user_id ORDER BY visited_at DESC) AS time_away
FROM user_visits
)

SELECT
username,
dbv.user_id AS id,
visited_at,
time_away
FROM days_between_visits dbv
JOIN users u ON u.id = dbv.user_id
WHERE time_away >= :days_away
ORDER BY visited_at DESC

如果运行它时遇到任何超时错误,请告诉我。请注意,我仍然在返回的结果中包含了用户的 ID。该列现在标记为 id。如果您不希望返回 ID,请从最后的 SELECT 语句中删除 dbv.user_id AS id, 行。

3 个赞

再次感谢!
我没有收到任何超时错误 :slight_smile:

2 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.