Postgresql 从昨天开始的100强在线用户postgres

Postgresql 从昨天开始的100强在线用户postgres,postgresql,self-join,sql-timestamp,Postgresql,Self Join,Sql Timestamp,下面是我发现的另一个有趣的查询,它可以为产品面试培训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

下面是我发现的另一个有趣的查询,它可以为产品面试培训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;

这将是一个混乱的评论。如果你不知道面试是什么,恐怕你还没有准备好面试。无论如何,你可能不需要它,你的问题也不清楚,无法理解你在问什么。我有两个问题要问你,不确定你是不是指其中一个:

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;

我为你创建了一个测试。希望这能有所帮助。

您可以使用侧向。您的SQL不可理解,我怀疑它是否有效。我试图使联接更明确。什么是侧边?你的评论没有那么有用。哦,你不知道!您可以提供一些示例数据和所需的输出,以便我们能够给出更好的答案。例如,当tab_a没有这样的字段时,a.date首先是什么?不,我不知道,但我很乐意去了解它。思维实验提问的全部意义在于,它们是在没有模拟数据的采访中进行的思维实验。在日期/时间戳col名称上采取并纠正的要点。