1
votes

comment utiliser le rang / rejoindre et où ensemble

J'ai utilisé plusieurs jointures internes dans mon code et j'ai fourni un rang, mais maintenant je veux sélectionner un rang particulier. Alors, comment utiliser le rang dans une instruction where?

Voici mon code, mais maintenant, aidez-moi à aller plus loin:

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

Maintenant, je veux sélectionner uniquement les rangs 3 et 4. Comment faire cela? p>


0 commentaires

3 Réponses :


1
votes

Si vous ne voulez que les classements 3 et 4, essayez ceci:

   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)


0 commentaires

1
votes

Vous pouvez faire une sous-requête ou CTE , je vous suggère d'essayer avec 2 méthodes et de regarder le choix du plan d'exécution qui fonctionne mieux:

Sous-requête

; 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

Expression de table commune

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 


0 commentaires

1
votes

Si vous ne voulez que les 3e et 4e valeurs - et en supposant qu'il n'y a pas d'égalité - alors utilisez offset/fetch:

offset 2 rows fetch first 2 rows only

Le offset 2 est dû au fait que le décalage commence à compter à 0 plutôt qu'à 1.


0 commentaires