La Función de agregado en Uniqueidentifier (GUID)

Digamos que tengo la siguiente tabla:

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

Básicamente, quiero hacer la siguiente SQL:

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

No tienen que ser necesariamente MIN. Sólo quiero volver uno GUID de cada categoría. No me importa que uno. Por desgracia, SQL Server no permite MIN o MAX en los Guid.

Por supuesto, podría convertir el guid en un varchar, o crear algunos anidada TOP 1 de SQL, pero que parece un feo solución. ¿Hay alguna solución elegante que me he perdido?

  • ¿Por qué estás haciendo esto? Usted puede simplemente utilizar SELECT DISTINCT category FROM myTable lugar? O ¿realmente necesitas una arbitraria GUID para cada categoría?
  • Sí, necesito un arbitrario GUID para cada categoría.
InformationsquelleAutor Heinzi | 2011-05-20

5 Kommentare

  1. 32

    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
  2. 48

    Acaba de lanzarla como un BINARY(16).

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

    Puedes lanzar de nuevo 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
    • usted puede convertir a una cadena – MIN(CAST(guid AS VARCHAR(36)))
  3. 18

    Funciones de agregado puede ser utilizado en las columnas Uniqueidentifier si la Versión de SQL Server >= 2012

    expresión

    Es una constante, el nombre de la columna, o de la función, y cualquier combinación de
    aritmética, bit a bit, y operadores de cadena. MIN puede ser utilizado con
    numérico, char, varchar, uniqueidentifier, o columnas datetime, pero no
    con columnas de bits. Funciones de agregado y subconsultas no
    permitido.

  4. 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   
  5. -4

    SELECT top 1 de la categoría, guid
    FROM myTable
    GRUPO POR categoría,guid

    • Gracias por el esfuerzo, pero su respuesta es incorrecta: 1 volverá a sólo 1 registro de después de agrupación (es decir, la respuesta contendrá sólo sea A o B).

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea