2010-01-23 3 views

Répondre

1
SELECT Cluster, ROW_NUMBER() OVER(ORDER BY Cluster) AS RowNo 
FROM 
(
    SELECT DISTINCT Cluster 
    FROM Company 
) x 

Ou ...

SELECT Cluster, ROW_NUMBER() OVER (ORDER BY Cluster) AS RowNo 
FROM Company 
GROUP BY Cluster 
+0

Deuxième option semble moins coûteuse (interms de perfomance) .. voté up – TonyP

+0

Je pense qu'ils peuvent se retrouver avec le même plan d'exécution (très rapide/test de base montre qu'ils le font). Mais je pense que le 2ème est plus concis. – AdaTheDev

0

Il est construit en fonction dans SQL appelé ROW_NUMBER()

EDIT: Selon des commentaires en perdant fonction distincte afin de Vous pouvez essayer de SubSelet

create function dbo.ftAllClusters() returns table as return 
    Select 
     Cluster 
     ,(ROW_NUMBER() OVER (order by Cluster)) as RN 
    from (
     Select 
      distinct 
      ,Cluster 
      from Company) as Comp 

Vous pouvez également essayer d'utiliser GROUP BY au lieu de DISTINC (je pense même que cela est peu plus rapide)

Select 
    Cluster 
    ,(ROW_NUMBER() OVER (order by Cluster)) as RN 
from Company 
group by Cluster 
+0

Cela annulerait l'opérateur Distinct, depuis ROW_NUMBER() fait toutes les lignes distinctes .. – TonyP

0

Voici la solution que je travaille sur, est-il une meilleure façon?

ALTER function dbo.ftAllClusters() returns table as return 
With CTE(comno) as 
(select distinct Cluster from company) 

select id=Row_number() over(order by comno),comno from cte 
Questions connexes