使用分区计算当前作业

时间:2021-05-23 20:50:14

标签: sql sql-server tsql select

下一个代码在用户和付款之间建立连接,以获得最后一笔付款。 如果付款表不包含具有与以下相同 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 的第一个匹配项的方法。欢迎提供任何线索,提前感谢您的帮助。

1 个答案:

答案 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 用于usersp 用于支付。不要使用无意义的字母。它们只会使查询难以阅读 - 并且难以维护。

相关问题