2011-05-20 13 views
41

Digamos que tengo el siguiente cuadro:función de agregado en Uniqueidentifier (GUID)

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

Básicamente, quiero hacer el siguiente SQL:

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

No necesariamente tiene que ser MIN. Solo quiero devolver un GUID de cada categoría. No me importa cuál. Desafortunadamente, SQL Server no permite MIN o MAX en GUID.

Por supuesto, podría convertir el guid en un varchar, o crear algún SQL TOP 1 anidado, pero eso parece una solución fea. ¿Hay alguna solución elegante que me he perdido?

+0

¿Por qué haces esto? ¿Puedes simplemente usar la categoría 'SELECCIONAR DISTINTO FROM myTable' en su lugar? ¿O realmente necesitas un GUID arbitrario para cada categoría? – verdesmarald

+0

@veredesmarald: Sí, necesito un GUID arbitrario para cada categoría. – Heinzi

Respuesta

29

asumiendo que usted está utilizando SQL Server 2005 o posterior:

;with Numbered as (
    select category,guid,ROW_NUMBER() OVER (PARTITION BY category ORDER BY guid) rn 
    from myTable 
) 
select * from Numbered where rn=1 
4
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 usted está en SQL Server 2000 que pudo para este

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 
39

Sólo lanzas como BINARY(16).

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

Puede volver a lanzarlo más tarde si es necesario.

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

puede convertirlo en una cadena - 'MIN (CAST (guid AS VARCHAR (36)))' – dsp0549

12

Las funciones de agregación se pueden utilizar en columnas UNIQUEIDENTIFIER si SQL Server versión> = 2012

expresión

es una constante, nombre de la columna, o función, y cualquier combinación de aritmética, a nivel de bit, y operadores de cadena. MIN se puede usar con columnas numéricas, char, varchar, uniqueidentifier o datetime, pero no con columnas de bits. Las funciones agregadas y las subconsultas no son permitidas.

+2

+1 - Enlace a 'MIN' en [2008 R2] (http://technet.microsoft.com/en- us/library/ms179916 (v = sql.105) .aspx) vs [2012] (http://technet.microsoft.com/en-us/library/ms179916 (v = sql.110) .aspx) – StuartLC

-3

SELECT TOP 1 categoría, GUID DE GRUPO myTable por categoría, GUID

+1

Gracias por el esfuerzo, pero su respuesta es incorrecta: TOP 1 devolverá solo 1 registro * después de * la agrupación (es decir, la respuesta contendrá solo * cualquiera * 'A' * o *' B'). – Heinzi

Cuestiones relacionadas