tSQL返回分区的第一行

tSQL返回分区的第一行,sql,sql-server,tsql,row-number,Sql,Sql Server,Tsql,Row Number,目标是使用尽可能少的资源返回分区的第一行。到目前为止,我已经看到了可以使用的建议: 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表,我们在其中跟

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

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表,我们在其中跟踪过去的客户详细信息(即:联系信息、公司名称等)。我现在使用的是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子句的后端进行筛选


提前谢谢

交叉应用使用内联视图获取订单的相关信息记录,但使用交叉应用运算符(不是真正的联接),它会对CustomerOrder中的每条记录执行此操作,并根据内联视图中定义的订单返回每个客户的前1条记录

SELECT * 
FROM CUSTOMERORDERS A
CROSS APPLY (SELECT top 1 * 
             FROM customerInfo B
             WHERE A.CustomerID = B.customerID
             ORDER by year desc) C
虽然基于名称的表格在我看来似乎有些落后;但从你的例子来看似乎是正确的

我可以看到很多订单,但有一个信息记录。。。所以我想你会希望每年的订单都是最好的。。。但也许不是

那么你是说这个

SELECT * 
FROM CustomerInfo A
CROSS APPLY (SELECT top 1 * 
             FROM CUSTOMERORDERS B
             WHERE A.CustomerID = B.customerID
             ORDER by year desc) C
但也许你每年都有每个客户的信息记录。。。所以也许不是


还有一篇相关文章解释了应用程序的用法以及一些好的示例以及为什么可以提高性能:

交叉应用程序使用内联视图获取订单的相关信息记录,但使用交叉应用运算符(不是真正的连接),它对customerOrders中的每条记录执行此操作,根据内联视图中定义的订单返回每个客户的前1条记录

SELECT * 
FROM CUSTOMERORDERS A
CROSS APPLY (SELECT top 1 * 
             FROM customerInfo B
             WHERE A.CustomerID = B.customerID
             ORDER by year desc) C
虽然基于名称的表格在我看来似乎有些落后;但从你的例子来看似乎是正确的

我可以看到很多订单,但有一个信息记录。。。所以我想你会希望每年的订单都是最好的。。。但也许不是

那么你是说这个

SELECT * 
FROM CustomerInfo A
CROSS APPLY (SELECT top 1 * 
             FROM CUSTOMERORDERS B
             WHERE A.CustomerID = B.customerID
             ORDER by year desc) C
但也许你每年都有每个客户的信息记录。。。所以也许不是


还有一篇相关文章解释了应用程序的用法以及一些很好的示例,以及为什么可以提高性能:

欢迎来到
apply
joinsWell的世界,与您在CTE中所做的相同,您可以插入临时表或表变量,然后使用过滤后的CTE(将WHERE条件放入CTE查询中)。使用表变量是很棘手的,因为查询优化器总是会为它估计1个返回行,但您当然可以尝试检查哪些行适合您。优化器可能足够聪明,可以做到这一点欢迎来到
Apply
joinsWell,与您在CTE中所做的相同,您可以插入临时表或表变量,然后使用过滤后的CTE(将WHERE条件放入CTE查询中)。使用表变量是很棘手的,因为查询优化器总是会为它估计1个返回行,但您当然可以尝试检查哪些行适合您。优化器可能足够聪明,可以做这件事,但不能保证效率更高。回答好,但不能保证效率更高。