昨天以来排名前100位的在线用户postgres

问题描述

这是我发现的另一个有趣的查询,用于训练sql产品采访。我真的对此感到怀疑-

给出下表

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,VisitAge
from visits
order by VisitAge desc
limit 5;

我创建了一个DbFiddle Demo供您测试。希望这会有所帮助。