自昨天 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 供您测试。希望这有帮助。