Sql server 在最近日期具有案例条件的左侧外部联接
我有两张桌子:Sql server 在最近日期具有案例条件的左侧外部联接,sql-server,Sql Server,我有两张桌子: dbo.Order PK_Order FK_Customer OrderDate Total 1 1 2020-01-20 150.00 2 1 2020-01-25 200.00 dbo.Customer: PK_Customer Name Age 1 John Miller 25 2 Max Monroe
dbo.Order
PK_Order FK_Customer OrderDate Total
1 1 2020-01-20 150.00
2 1 2020-01-25 200.00
dbo.Customer:
PK_Customer Name Age
1 John Miller 25
2 Max Monroe 28
我想合并这两个表,但当客户有多个订单时,只应合并具有最新日期的订单。这将是连接这两者的初始代码:
SELECT *
FROM dbo.Customer as Customer
LEFT OUTER JOIN dbo.Order
ON Customer.PK_Customer = dbo.Order.FK_Customer
我从未在查询中处理过案例条件。有人能给我一个提示吗?我喜欢用带领带的
TOP 1解决以下问题:
SELECT TOP 1 WITH TIES *
FROM dbo.Customer c
LEFT OUTER JOIN o
ON c.PK_Customer = o.FK_Customer
ORDER BY
ROW_NUMBER() OVER (PARTITION BY c.PK_Customer ORDER BY o.OrderDate DESC);
您可以将“仅加入”记录保留为最新日期:
--CREATE TABLE [Order]
--(
-- PK_Order int,
-- FK_Customer int,
-- OrderDate date,
-- Total decimal(10,2)
--)
--INSERT [Order] VALUES
--(1,1,'2020-01-20',150),
--(2,1,'2020-01-25',200)
--CREATE TABLE Customer
--(
-- PK_Customer int,
-- Name nvarchar(20),
-- Age int
--)
--INSERT [Customer] VALUES
--(1,'John Miller',25),
--(2,'Max Monroe',28)
SELECT *
FROM dbo.Customer C
LEFT OUTER JOIN dbo.[Order] O
ON C.PK_Customer = O.FK_Customer
AND OrderDate=(SELECT MAX(OrderDate) FROM [Order] WHERE [Order].FK_Customer=O.FK_Customer)
注1:由于近期可能有许多订单,我保留所有订单
注2:保持年龄不是一个好主意-它必须每年更新。保留出生日期。这与Tim的答案类似,但不同之处在于分区依据位于orders表中,并且每一位客户在第1行加入
select * from #Customer c
left join
(select ROW_NUMBER() over (partition by FK_Customer order by OrderDate desc) as order_NUM,
PK_Order,
FK_Customer,
OrderDate,
Total from #Order
) o on c.PK_Customer = o.FK_Customer and order_NUM = 1
order by c.PK_Customer, o.OrderDate desc