目标是使用尽可能少的资源返回分区的第一行。到目前为止,我已经看到了使用的建议:
with customerinfo_CTE as
(
select row_number() over(partition by customer order by year desc) as RNumber, *
from customerInfo
)
select *
from customerinfo_CTE
where RNumber = 1
因此,我有一个客户信息表,我们可以在其中跟踪过去的客户详细信息(即:联系信息,公司名称等(。此时我正在使用 CTE,但也可以使用 #Temp 表或@Variable表。
我希望有一种方法可以提高性能,方法是在 CTE(或其他任何内容(中获取当年唯一的第一条记录,然后再将其用于联接或脚本的其他部分。
现在,我正在使用:
with customerinfo_CTE as
(
select row_number() over(partition by customer order by year desc) as RNumber, *
from customerInfo
)
select *
from customerOrders a
inner join customerinfo_CTE b
on a.CustomerID = b.CustomerID
where b.RNumber = 1
虽然这给了我想要的结果,但我希望有一种方法可以精简它,以便在 CTE 声明中获得第一个结果,而无需在连接的 where 子句中
筛选后端。提前谢谢。
交叉应用使用内联视图将相关信息记录获取到订单,但使用交叉应用运算符(不是真正的联接(,它对 customerOrders 中的每条记录执行此操作,根据内联视图中定义的订单为每个客户返回 TOP 1 记录。
SELECT *
FROM CUSTOMERORDERS A
CROSS APPLY (SELECT top 1 *
FROM customerInfo B
WHERE A.CustomerID = B.customerID
ORDER by year desc) C
虽然基于名称的表格对我来说似乎是倒退的; 但基于你的例子似乎是正确的。
我可以看到很多订单,但 1 条信息记录...所以我认为你会想要按订单年份排列的最高订单......但也许不是。
所以也许你是这个意思?
SELECT *
FROM CustomerInfo A
CROSS APPLY (SELECT top 1 *
FROM CUSTOMERORDERS B
WHERE A.CustomerID = B.customerID
ORDER by year desc) C
但也许您每年都有每个客户的信息记录......所以也许不是..
还有一篇相关文章解释了应用程序用法以及一些很好的示例以及为什么可以提高性能:https://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/