下一个代码在用户和付款之间建立连接,以获得最后一笔付款。 如果付款表不包含具有与以下相同 max_date 的重复行,则该查询应该可以工作。
需要注意的是,该行并非完全重复,有时包含的变化很小。但是我们不在乎是否选择了“正确”的那个,我们只需要它是一个,无论是哪一个。
user_ID | Payment | date | product | credit_card
1 300 1/1/2020 A No
1 300 1/1/2020 Null | No
1 300 1/1/2021 A Yes
1 300 1/1/2021 Null | Yes
这会导致第二个内部连接重复行,因为它与 maxDate 1/1/2021 进行了两次匹配
SELECT a.*, c.*
FROM users a
INNER JOIN payments c
ON a.id = c.user_ID
INNER JOIN
(
SELECT user_ID, MAX(date) maxDate
FROM payments
GROUP BY user_ID
) b ON c.user_ID = b.user_ID AND
c.date = b.maxDate
我正在寻找一种仅选择 maxDate 的第一个匹配项的方法。欢迎提供任何线索,提前感谢您的帮助。
答案 0 :(得分:3)
您应该为此使用窗口函数。那将是:
SELECT u.*, p.*
FROM users u JOIN
(SELECT p.*,
ROW_NUMBER() OVER (PARTITION BY p.user_id ORDER BY p.date DESC) as seqnum
FROM payments p
) p
ON p.user_ID = u.id AND p.seqnum = 1;
这将返回一行,但哪一行是任意的。
注意查询中有意义表别名的使用——u
用于users
,p
用于支付。不要使用无意义的字母。它们只会使查询难以阅读 - 并且难以维护。