问题描述
这是我发现的另一个有趣的查询,用于训练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供您测试。希望这会有所帮助。