我有2个表:用户和视频
当我想列出今天创建的所有视频时,我想将用户条目限制为1.这样就可以从查询最大值返回一个用户的视频。我不希望从同一用户返回多个视频。我将此响应用作JSON格式。
如何为此目的编写SQL?
谢谢!
答案 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表,因为您没有请求任何列。此外,这假设数据中没有未来的日期/时间。