Sql 如何使用秩/连接以及在何处连接

Sql 如何使用秩/连接以及在何处连接,sql,sql-server,Sql,Sql Server,我在代码中使用了多个内部联接,并提供了秩,但现在我想选择一个特定的秩。那么如何在where语句中使用rank呢 这是我的代码,但现在请帮助我继续: select [YEAR], [IDManufacturer], sum([TotalPrice]), rank() over (order by sum(totalprice) desc) as sales_rank from [dbo].[DIM_DATE] join [d

我在代码中使用了多个内部联接,并提供了秩,但现在我想选择一个特定的秩。那么如何在where语句中使用rank呢

这是我的代码,但现在请帮助我继续:

select [YEAR],
       [IDManufacturer],
       sum([TotalPrice]), 
       rank() over (order by sum(totalprice) desc) as sales_rank
       from [dbo].[DIM_DATE] 
       join [dbo].[FACT_TRANSACTIONS] 
       on [dbo].[FACT_TRANSACTIONS].Date = [dbo].[DIM_DATE].DATE
       join [dbo].[DIM_MODEL] 
       on [dbo].[DIM_MODEL].IDModel=[dbo].[FACT_TRANSACTIONS].IDModel
       where [YEAR] in (2009,2010) 
       group by IDManufacturer,[year]
       order by sum([TotalPrice]) desc

现在我只想选择排名3和4。如何做到这一点?

如果您只想要排名3和4,请尝试以下方法:

   select * from (
   select [YEAR],
   [IDManufacturer],
   sum([TotalPrice]), 
   rank() over (order by sum(totalprice) desc) as sales_rank
   from [dbo].[DIM_DATE] 
   join [dbo].[FACT_TRANSACTIONS] 
   on [dbo].[FACT_TRANSACTIONS].Date = [dbo].[DIM_DATE].DATE
   join [dbo].[DIM_MODEL] 
   on [dbo].[DIM_MODEL].IDModel=[dbo].[FACT_TRANSACTIONS].IDModel
   where [YEAR] in (2009,2010) 
   group by IDManufacturer,[year]
   order by sum([TotalPrice]) desc
 ) t where sales_rank in (3,4)

您可以执行
子查询
CTE
,我建议您尝试使用两种方法,并查看执行计划选择哪种执行效果更好:

子查询

SELECT * FROM 
(select [YEAR],
       [IDManufacturer],
       sum([TotalPrice]) TotalPrice, 
       rank() over (order by sum(totalprice) desc) as sales_rank
from [dbo].[DIM_DATE] 
       join [dbo].[FACT_TRANSACTIONS] 
       on [dbo].[FACT_TRANSACTIONS].Date = [dbo].[DIM_DATE].DATE
       join [dbo].[DIM_MODEL] 
       on [dbo].[DIM_MODEL].IDModel=[dbo].[FACT_TRANSACTIONS].IDModel
where [YEAR] in (2009,2010) 
       group by IDManufacturer,[year]
) as SQ
Where sales_rank = 3 or sales_rank = 4
go 
通用表表达式

; with CTE as

(select [YEAR],
       [IDManufacturer],
       sum([TotalPrice]) TotalPrice, 
       rank() over (order by sum(totalprice) desc) as sales_rank
from [dbo].[DIM_DATE] 
       join [dbo].[FACT_TRANSACTIONS] 
       on [dbo].[FACT_TRANSACTIONS].Date = [dbo].[DIM_DATE].DATE
       join [dbo].[DIM_MODEL] 
       on [dbo].[DIM_MODEL].IDModel=[dbo].[FACT_TRANSACTIONS].IDModel
where [YEAR] in (2009,2010) 
       group by IDManufacturer,[year]
)

SELECT * FROM CTE WHERE sales_rank = 3 or sales_rank = 4


如果您只需要第3和第4个值,并且假设没有关联,则使用
offset/fetch

offset 2 rows fetch first 2 rows only
偏移量2
是因为偏移量从
0
开始计数,而不是从
1
开始计数