Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
的PostgreSQL查询仅显示一个用户条目_Sql_Postgresql_Greatest N Per Group - Fatal编程技术网

的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,时间戳
当我想列出今天创建的所有视频时,我想将用户输入限制为1。这样,一个用户的视频将从查询最大值返回。我不希望从同一个用户返回多个视频。我将使用此响应作为JSON格式

如何为此编写sql


谢谢大家!

将公共
用户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。我知道这不太可能,也可能不是这样,但用户的内部连接理论上可以限制从视频表返回的记录数。你的观点是正确的,我知道这不太可能,也可能不是这样,但用户的内部连接理论上可以限制从视频表返回的记录数。你的观点被很好地理解了,可能是正确的。