我只想左键联接一个只有最新记录的表。我有 Customer1
表格:
+--------+----------+
| CustID | CustName |
+--------+----------+
| 1 | ABC123 |
| 2 | 456XYZ |
| 3 | 5PQR3 |
| 4 | 789XYZ |
| 5 | 789A |
+--------+----------+
``` `SalesInvoice` 表格:
+------------+--------+-----------+
| InvDate | CustID | InvNumber |
+------------+--------+-----------+
| 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 |
+------------+--------+-----------+
我想要这个必要的输出:
+--------+------------+-----------+
| CustID | InvDate | InvNumber |
+--------+------------+-----------+
| 1 | 2020-04-07 | IV644 |
| 2 | 2020-06-13 | IV869 |
| 3 | 2020-03-29 | IV436 |
| 4 | | |
| 5 | | |
+--------+------------+-----------+
为了方便快捷,下面是示例代码。
drop table if exists #Customer1
create table #Customer1(CustID int, CustName varchar (100))
insert into #Customer1 values
(1,'ABC123'),
(2,'456XYZ'),
(3,'5PQR3'),
(4,'789XYZ'),
(5,'789A')
drop table if exists #SalesInvoice
create table #SalesInvoice(InvDate DATE, CustID INT, InvNumber varchar (100))
insert into #SalesInvoice values
('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')
3条答案
按热度按时间j2datikz1#
我喜欢用
TOP 1 WITH TIES
在这种情况下:演示
这里最重要的一个技巧是按行号订购,为每个客户分配一个序列,序列按发票日期递减。然后,这种方法只保留每个客户的最新发票记录。
bjp0bcyl2#
我推荐
outer apply
:nafvub8i3#
您可以使用这个简单的自我解释的t-sql来尝试行数窗口函数,而不是横向联接
基本上,行号是用来过滤“最后”的发票在一个表扫描,而不是执行选择前1。。。order by在相关查询中必须执行多次--与客户数一样多。