首页 > 解决方案 > SQL选择省略倍数

问题描述

我有两 (2) 个表 - 帐户和订单。Order 列的每一行都包含一个 Account ID,它将其链接到 Account 表中的特定 Account。每个账户可以有任意数量(零-n)个订单。我已经在 Account ID 上将两者 LEFT OUTER JOINED,所以表格如下所示:

|Account ID|Account Data|Order A/C ID|Order ID|Order Date|
----------------------------------------------------------
|A001      |Blah blah   |A001        |O001    |Some date |
|A001      |Blah blah   |A001        |O002    |Some date |
|A002      |Blah blah   |A002        |O003    |Some date |
|A003      |Blah blah   |Null        |        |          |
|A004      |Blah blah   |A004        |O005    |Some date |
|A004      |Blah blah   |A004        |O006    |Some date |
|A005      |Blah blah   |A005        |O007    |Some date |
|A005      |Blah blah   |A005        |O008    |Some date |
|A005      |Blah blah   |A005        |O009    |Some date |

但是我想让表格只显示每个帐户的一行,按订单的某些字段(例如,对于一个帐户的每个订单,通过订单日期字段选择最近的一个并只显示那个)。

该表还必须显示没有账户订单的行。

当然,这个想法是获取一个表格,显示每个帐户的最新订单,或者,如果该帐户没有订单,则在订单字段中为空。

哦,值得一提的是,SQL Server 17.8。

标签: sqlsql-serverleft-joinsql-order-by

解决方案


您可以使用排名功能对帐户的订单进行排名,然后选择第一排名订单,如下所示 -

Select * from
(
    Select 
     A.AccountId,
     A.AccountData,
     o.OrderAcctId,
     o.OrderId,
     o.OrderDate,
     Rank() Over (Partition by A.AccountId order by O.OrderDate) as Rnk
    From Account 
    Left Join Order O on A.AccountId = o.OrderAcctId
) Query 
Where Rnk = 1

推荐阅读