【发布时间】:2017-05-08 14:55:54
【问题描述】:
目标是使用尽可能少的资源返回分区的第一行。到目前为止,我已经看到了使用建议:
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 子句中过滤后端。
提前致谢。
【问题讨论】:
-
欢迎来到
Apply加入的世界 -
好吧,您在 CTE 中所做的相同,您可以将其插入到临时表或表变量中,然后使用过滤后的 CTE(将 WHERE 条件放在 CTE 查询中)。使用表变量很棘手,因为查询优化器总是会为它估计 1 个返回的行,但您当然可以尝试检查什么对您有用。
-
优化器可能足够聪明
标签: sql sql-server tsql row-number