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>
3 Réponses :
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)
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
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.