的PostgreSQL查询仅显示一个用户条目
我有两个表:用户和视频的PostgreSQL查询仅显示一个用户条目,sql,postgresql,greatest-n-per-group,Sql,Postgresql,Greatest N Per Group,我有两个表:用户和视频 视频:视频ID、用户ID、时间戳 用户:用户ID,时间戳 当我想列出今天创建的所有视频时,我想将用户输入限制为1。这样,一个用户的视频将从查询最大值返回。我不希望从同一个用户返回多个视频。我将使用此响应作为JSON格式 如何为此编写sql 谢谢大家! 将公共用户ID上的两个表连接起来,然后在用户上使用带有分区的行编号查找每个用户的最新视频 SELECT videoID, userID, timestamp FROM ( SELECT u.userID, v.v
- 视频:视频ID、用户ID、时间戳
- 用户:用户ID,时间戳
谢谢大家! 将公共
用户ID上的两个表连接起来,然后在用户上使用带有分区的行编号
查找每个用户的最新视频
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;
将公共userID
上的两个表连接起来,然后使用ROW\u 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;
你可能想考虑<代码> 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),这和你所期望的一样好。使用行数
的一个缺点是,如果同一用户有两个具有相同时间戳的视频,这将返回两行,在这种情况下,最好使用Tim的解决方案,虽然如果有一个领带,你可能应该有一些方法选择一个或另一个。 你可能想考虑<代码> max < /Cord>窗口函数:
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),这和你所期望的一样好。使用行数
的一个缺点是,如果同一用户有两个具有相同时间戳的视频,这将返回两行,在这种情况下,Tim的解决方案将是首选,尽管如果有一个结,您可能应该有一些方法来选择其中一个。Postgres提供了独特的
,哪种方法最简单:
select distinct on (v.userid) v.*
from videos v
where timestamp >= current_date
order by v.userid;
注意:您不需要users表,因为您没有从该表请求任何列。此外,这假设数据中没有未来的日期/时间。Postgres提供了上的distinct on
,这是最简单的方法:
select distinct on (v.userid) v.*
from videos v
where timestamp >= current_date
order by v.userid;
注意:您不需要users表,因为您没有从该表请求任何列。也,这假设数据中没有未来的日期/时间。为什么用户
表有一个时间戳列?它是一个显示该用户创建日期的创建时间戳。我试图在下面回答。为什么用户
表有一个时间戳列?它是一个显示该用户创建日期的创建时间戳那个用户。我尝试了下面的答案。实际上我的解决方案也很糟糕,因为行号无法检测到领带。排名会更好,对你来说是+1。实际上我的解决方案也很糟糕,因为行号无法检测领带。排名会更好,对你来说是+1。我知道这不太可能,也可能不是这样,但用户的内部连接理论上可以限制从视频表返回的记录数。你的观点是正确的,我知道这不太可能,也可能不是这样,但用户的内部连接理论上可以限制从视频表返回的记录数。你的观点被很好地理解了,可能是正确的。