PostgreSQL查询只显示一个用户条目

时间:2017-12-12 11:02:06

标签: sql postgresql greatest-n-per-group

我有2个表:用户和视频

  • 视频:videoID,userID,timestamp
  • 用户:userID,timestamp

当我想列出今天创建的所有视频时,我想将用户条目限制为1.这样就可以从查询最大值返回一个用户的视频。我不希望从同一用户返回多个视频。我将此响应用作JSON格式。

如何为此目的编写SQL?

谢谢!

3 个答案:

答案 0 :(得分:1)

将两个表加入公共userID,然后将ROW_NUMBER与用户分区一起使用,以查找每个用户的最新视频。

SELECT videoID, userID, timestamp
FROM
(
    SELECT u.userID, v.videoID, v.timestamp,
        ROW_NUMBER() OVER (PARTITION BY u.userID ORDER BY v.timestamp DESC) rn
    FROM users u
    INNER JOIN videos v
        ON u.userID = v.userId
) t
WHERE t.rn = 1;

答案 1 :(得分:1)

您可能需要考虑max窗口函数:

with videoz as (
  select
    v.*,
    max (v.timestamp) over (partition by v.user_id) as max_timestamp
  from
    videos v
    join users u on v.userid = u.user_id
)
select
  videoid, userid, timestamp
from videoz
were
  timestamp = max_timestamp

理论上,这应该是 O(n),这和你期望的一样好。使用row_number的一个缺点是,如果你有同一个用户的两个视频有相同的时间戳,这将返回两行,在这种情况下蒂姆的解决方案将是首选,但如果有一个平局,你可能应该有一些方法可以选择其中一种。

答案 2 :(得分:0)

Postgres提供distinct on,这是最简单的方法:

select distinct on (v.userid) v.*
from videos v
where timestamp >= current_date
order by v.userid;

注意:您不需要users表,因为您没有请求任何列。此外,这假设数据中没有未来的日期/时间。