[英]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.