47 votes

Fonction d'agrégation sur identificateur unique (GUID)

Disons que j'ai le tableau suivant:

category | guid
---------+-----------------------
   A     | 5BC2...
   A     | 6A1C...
   B     | 92A2...

En gros, je veux faire la requête SQL suivante:

SELECT category, MIN(guid)
  FROM myTable
 GROUP BY category

Il n'a pas nécessairement à être MIN. Je veux juste revenir un GUID de chaque catégorie. Je n'aime pas lequel. Malheureusement, SQL Server n'autorise pas MIN ou MAX sur la Guid.

Bien sûr, je pourrais convertir le guid dans un varchar, ou de créer des imbriquée TOP 1 de SQL, mais ça me paraît laid solution de contournement. Est-il une solution élégante que j'ai manqué?

48voto

K Biel Points 221

Il suffit de le lancer comme BINARY(16) .

 SELECT category, MIN(CAST(guid AS BINARY(16))
FROM myTable
GROUP BY category
 

Vous pouvez le rejeter plus tard si nécessaire.

 WITH CategoryValue
AS
(    
    SELECT category, MIN(CAST(guid AS BINARY(16)))
    FROM myTable
    GROUP BY category
)
SELECT category, CAST(guid AS UNIQUEIDENTIFIER)
FROM CategoryValue
 

32voto

Damien_The_Unbeliever Points 102139

En supposant que vous utilisez SQL Server 2005 ou une version ultérieure:

 ;with Numbered as (
     select category,guid,ROW_NUMBER() OVER (PARTITION BY category ORDER BY guid) rn
     from myTable
)
select * from Numbered where rn=1
 

18voto

doerig Points 896

Les fonctions d'agrégation peuvent être utilisées sur les colonnes Uniqueidentifier si la version SQL Server> = 2012

expression

Est une constante, un nom de colonne ou une fonction et toute combinaison d'opérateurs arithmétiques, au niveau des bits et de chaîne. MIN peut être utilisé avec les colonnes numeric, char, varchar, uniqueidentifier ou datetime, mais pas avec les colonnes de bits. Les fonctions d'agrégation et les sous-requêtes ne sont pas autorisées.

4voto

Mikael Eriksson Points 77190
 declare @T table(category char(1), guid uniqueidentifier) 

insert into @T 
select 'a', newid() union all
select 'a', newid() union all
select 'b', newid()

select
  S.category,
  S.guid
from
(  
  select
    T.category,
    T.guid,
    row_number() over(partition by T.category order by (select 1)) as rn
  from @T as T
) as S
where S.rn = 1
 

Si vous êtes sur SQL Server 2000, vous pouvez le faire

 select 
  T1.category,
  (select top 1 T2.guid 
   from @T as T2
   where T1.category = T2.category) as guid
from @T as T1
group by T1.category   
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X