SQL与最新记录左连接
我只想左键联接一个具有最新记录的表。 我有Customer1表: +----+-----+ |CustID | CustName| +----+-----+ |1 | ABC123| |2 | 456XYZ| |3 | 5PQR3| |4 | 789XYZ| |5 | 789A| +----+-----+ 销售发票表: +------+----+------+ |投资日期|客户ID |投资编号| +------+----+------+ |2020-03-01 | 1 | IV236| |2020-04-07 | 1 | IV644| |2020-06-13 | 2 | IV869| |2020-03-29 | 3 | IV436| |2020-02-06 | 3 | IV126| +------+----+------+ 我想要这个必需的输出: +----+------+------+ |客户ID |投资日期|投资编号| +----+------+------+ |1 | 2020-04-07 | IV644| |2 | 2020-06-13 | IV869| |3 | 2020-03-29 | IV436| | 4 | | | | 5 | | | +----+------+------+ 为了方便快捷,下面是示例代码 如果存在Customer1,则删除表 创建表Customer1CustID int,CustName varchar 100 插入到Customer1值中 1、‘ABC123’, 2,'456XYZ', 3、'5PQR3', 4,'789XYZ', 5,'789A' 如果存在销售发票,则删除表 创建表SalesInvoiceInvDate DATE,CustID INT,InvNumber varchar 100 插入到SalesInvoice值中 “2020-03-01”,1,“IV236”, '2020-04-07',1,'IV644', “2020-06-13”,2,“IV869”, “2020-03-29”,3,“IV436”, '2020-02-06',3,'IV126' 我建议你: 外部应用实现一种称为横向连接的特殊类型的连接。这是一个非常强大的构造。但在了解它们时,您可以将横向联接视为一个相关子查询,它可以返回多个列和多个行。我建议您: 外部应用实现一种称为横向连接的特殊类型的连接。这是一个非常强大的构造。但是,当了解它们时,您可以将横向联接视为一个相关子查询,它可以返回多个列和多个行。在这种情况下,我喜欢使用带连接的TOP 1:SQL与最新记录左连接,sql,sql-server,tsql,Sql,Sql Server,Tsql,我只想左键联接一个具有最新记录的表。 我有Customer1表: +----+-----+ |CustID | CustName| +----+-----+ |1 | ABC123| |2 | 456XYZ| |3 | 5PQR3| |4 | 789XYZ| |5 | 789A| +----+-----+ 销售发票表: +------+----+------+ |投资日期|客户ID |投资编号| +------+----+------+ |2020-03-01 | 1 | IV236| |202
SELECT TOP 1 WITH TIES c.CustID, i.InvDate, i.InvNumber
FROM #Customer1 c
LEFT JOIN #Invoices i ON c.CustID = i.CustID
ORDER BY ROW_NUMBER() OVER (PARTITION BY c.CustID ORDER BY i.InvDate DESC);
这里的第一个技巧是按行号订购,为每个客户分配一个序列,序列按发票日期递减。然后,这种方法只保留每个客户的最新发票记录。在这种情况下,我喜欢使用带领带的TOP 1:
SELECT TOP 1 WITH TIES c.CustID, i.InvDate, i.InvNumber
FROM #Customer1 c
LEFT JOIN #Invoices i ON c.CustID = i.CustID
ORDER BY ROW_NUMBER() OVER (PARTITION BY c.CustID ORDER BY i.InvDate DESC);
这里的第一个技巧是按行号订购,为每个客户分配一个序列,序列按发票日期递减。然后,这种方法只保留每个客户的最新发票记录。您可以尝试使用行数窗口功能,而不是使用这个简单的自我解释的T-SQL进行横向联接
SELECT c.CustID
, d.InvDate
, d.InvNumber
FROM #C c
LEFT JOIN (
SELECT *
, ROW_NUMBER() OVER (PARTITION BY CustID ORDER BY InvDate DESC) AS RowNo
FROM #D
) d
ON c.CustID = d.CustID
AND d.RowNo = 1
基本上,行号用于在一次表扫描中过滤最后一张发票,而不是执行选择前1。。。相关查询中的ORDER BY必须执行多次,次数与客户数相同。您可以使用此简单的自解释T-SQL尝试行数窗口功能,而不是横向联接
SELECT c.CustID
, d.InvDate
, d.InvNumber
FROM #C c
LEFT JOIN (
SELECT *
, ROW_NUMBER() OVER (PARTITION BY CustID ORDER BY InvDate DESC) AS RowNo
FROM #D
) d
ON c.CustID = d.CustID
AND d.RowNo = 1
基本上,行号用于在一次表扫描中过滤最后一张发票,而不是执行选择前1。。。必须多次执行的相关查询中的ORDER BY-与客户数量相同