繁体   English   中英

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

[英]Pull a Row Value associated with the Max Value of a Column

我们有两个要加入的表,一个是用户表,另一个是订阅表。

用户表存储以下列 • 用户 ID • 名称 • Email • 帐户创建日期

每次有新用户加入时,都会在此表中添加一个新行。

订阅表故事列,如 • 订阅 ID • 用户 ID • 订阅创建于 • 订阅结束于 • 订阅状态

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

我们的目标是创建一个返回以下列的查询 • 用户 ID • Email • 帐户创建日期 • 订阅状态(活动/取消/NULL)

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

 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

我们如何编写一个查询,在该查询中提取订阅的订阅状态,其中 Max Subscription Created At date?

我就是这样做的。 不确定这是否是最好的方法。 ;)

加入用户 ID 和 max Max Subscription Created At date 的子查询,并使用它来过滤那些结果。

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

一种常用的方法是使用 window 函数:

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM