Sql 拉取与列的最大值关联的行值

Sql 拉取与列的最大值关联的行值,sql,Sql,我们有两个要联接的表,一个是用户表,另一个是订阅表 Users表存储列,如 •用户ID •名称 •电子邮件 •账户创建日期 每次新用户加入时,都会向该表中添加一个新行 订阅表故事列,如 •订阅ID •用户ID •订阅创建于 •订阅截止日期为 •订阅状态 每次用户重新订阅时,都会添加一个新行。继续现有订阅不会创建新行 我们的目标是创建一个返回以下列的查询 •用户ID •电子邮件 •账户创建日期 •订阅状态(活动/取消/空) 但是,当我们尝试执行下面的查询时,它会为具有多个订阅的创建者返回多行 S

我们有两个要联接的表,一个是用户表,另一个是订阅表

Users表存储列,如 •用户ID •名称 •电子邮件 •账户创建日期

每次新用户加入时,都会向该表中添加一个新行

订阅表故事列,如 •订阅ID •用户ID •订阅创建于 •订阅截止日期为 •订阅状态

每次用户重新订阅时,都会添加一个新行。继续现有订阅不会创建新行

我们的目标是创建一个返回以下列的查询 •用户ID •电子邮件 •账户创建日期 •订阅状态(活动/取消/空)

但是,当我们尝试执行下面的查询时,它会为具有多个订阅的创建者返回多行

 SELECT
       u.user_id,
       u.email,
       u.account_create_date
       s.subscription_status
    FROM
       users as u
    INNER JOIN
       subscriptions as s
       on s.user_id = u.user_id


我们如何编写一个查询,从中提取在日期创建的最大订阅的订阅状态?

我将这样做。不确定这是否是最好的方式

加入在日期创建的用户ID和最大订阅的子查询,并使用该子查询仅筛选这些结果

SELECT
   u.user_id,
   u.email,
   u.account_create_date
   s.subscription_status
FROM
   users as u
INNER JOIN
   subscriptions as s
   on s.user_id = u.user_id
INNER JOIN 
   (SELECT s.user_id, 
   MAX(s.subscription_created_at) AS subscription_created_at
   FROM subscriptions 
   GROUP BY s.user_id) max_s
   ON max_s.user_id = s.user_id

WHERE s.subscription_created_at = max_s.subscription_created_at

常用的方法是使用窗口函数:

SELECT u.user_id, u.email, u.account_create_date
       s.subscription_status
FROM users u JOIN
     (SELECT s.*,
             ROW_NUMBER() OVER (PARTITION BY s.user_id ORDER BY s.created_at DESC) as seqnum
      FROM subscriptions s
     ) s
     ON s.user_id = u.user_id AND s.seqnum = 1;

用您正在使用的数据库标记您的问题。