tSQL Return 分区第一行

tSQL Return first row of partition

目标是 return 分区的第一行使用尽可能少的资源。到目前为止,我已经看到了使用建议:

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

所以,我有一个 customerInfo table,我们在其中跟踪过去的客户详细信息(即:联系信息、公司名称等)。我此时正在使用 CTE,但也可以使用 #Temp Table 或 @Variable Table。

我希望有一种方法可以提高性能,方法是先在 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/