自昨天 postgres 以来前 100 名在线用户
top 100 users online since yesterday postgres
这是我发现的另一个有趣的查询,用于训练 SQL 进行产品面试。我真的很怀疑 -
给出以下 table
tab_a: user_id, date (they entered platform)
找出截至昨天连续访问该平台时间最长的前 100 名用户。
我将“最长连续记录”定义为同一用户的两个时间戳之间的间隔。
这是我使用自连接的解决方案,有人有更好的主意吗?
select a.user_id,
age(a.date, b.date) as streak
from tab_a as a
inner join tab_a as b
using(user_id)
and a.date > date 'yesterday' -- PostgreSQL 'yesterday' syntactic sugar
order by streak desc
limit 100;
这将是一个混乱的评论。如果您不知道什么是横向,恐怕您还没有准备好接受面试。无论如何,您可能不需要它并且您的问题不清楚您在问什么。我有 2 个问题要问你,但不确定你的意思是不是其中之一:
with visits as
(
select user_id, min(visit) as firstVisit, max(visit) as lastVisit
from tab_a
group by user_id
)
select user_id, age(lastVisit, firstVisit)
from visits;
with visits as (
select user_id, visit,
coalesce(age(visit, lag(visit,1) over (partition by user_id order by visit)), '0'::interval) as VisitAge
from tab_a
)
select user_id, visit, VisitAge
from visits
order by VisitAge desc
limit 5;
我创建了一个 DbFiddle Demo 供您测试。希望这有帮助。
这是我发现的另一个有趣的查询,用于训练 SQL 进行产品面试。我真的很怀疑 -
给出以下 table
tab_a: user_id, date (they entered platform)
找出截至昨天连续访问该平台时间最长的前 100 名用户。
我将“最长连续记录”定义为同一用户的两个时间戳之间的间隔。
这是我使用自连接的解决方案,有人有更好的主意吗?
select a.user_id,
age(a.date, b.date) as streak
from tab_a as a
inner join tab_a as b
using(user_id)
and a.date > date 'yesterday' -- PostgreSQL 'yesterday' syntactic sugar
order by streak desc
limit 100;
这将是一个混乱的评论。如果您不知道什么是横向,恐怕您还没有准备好接受面试。无论如何,您可能不需要它并且您的问题不清楚您在问什么。我有 2 个问题要问你,但不确定你的意思是不是其中之一:
with visits as
(
select user_id, min(visit) as firstVisit, max(visit) as lastVisit
from tab_a
group by user_id
)
select user_id, age(lastVisit, firstVisit)
from visits;
with visits as (
select user_id, visit,
coalesce(age(visit, lag(visit,1) over (partition by user_id order by visit)), '0'::interval) as VisitAge
from tab_a
)
select user_id, visit, VisitAge
from visits
order by VisitAge desc
limit 5;
我创建了一个 DbFiddle Demo 供您测试。希望这有帮助。