Sql Uniqueidentifier(GUID)上的聚合函数

Sql Uniqueidentifier(GUID)上的聚合函数,sql,sql-server,guid,aggregate,uniqueidentifier,Sql,Sql Server,Guid,Aggregate,Uniqueidentifier,假设我有下表: category | guid ---------+----------------------- A | 5BC2... A | 6A1C... B | 92A2... 基本上,我要执行以下SQL操作: SELECT category, MIN(guid) FROM myTable GROUP BY category 它不一定是MIN。我只想返回每个类别的一个GUID。我不管是哪一个。不幸的是,SQL Server不允许在GU

假设我有下表:

category | guid
---------+-----------------------
   A     | 5BC2...
   A     | 6A1C...
   B     | 92A2...
基本上,我要执行以下SQL操作:

SELECT category, MIN(guid)
  FROM myTable
 GROUP BY category
它不一定是MIN。我只想返回每个类别的一个GUID。我不管是哪一个。不幸的是,SQL Server不允许在GUID上使用最小值或最大值


当然,我可以将guid转换为varchar,或者创建一些嵌套的TOP 1 SQL,但这似乎是一个丑陋的解决方法。有没有我错过的优雅解决方案

假设您使用的是SQL Server 2005或更高版本:

;with Numbered as (
     select category,guid,ROW_NUMBER() OVER (PARTITION BY category ORDER BY guid) rn
     from myTable
)
select * from Numbered where rn=1
如果您使用的是SQL Server 2000,则可以访问此

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   

只需将其转换为
二进制(16)

如有必要,您可以稍后将其放回

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

如果SQL Server版本>=2012,则可以在Uniqueidentifier列上使用聚合函数

表情

是常量、列名或函数,以及 算术运算符、位运算符和字符串运算符。MIN可以与 numeric、char、varchar、uniqueidentifier或datetime列,但不包括 具有位列。不支持聚合函数和子查询 允许


选择前1个类别,guid 从myTable
按类别分组,guid

为什么要这样做?您是否可以使用
从myTable
中选择不同的类别?或者您真的需要每个类别的任意GUID吗?@Veredesmarld:是的,我需要每个类别的任意GUID。您可以将其转换为字符串-
MIN(强制转换(GUID为VARCHAR(36))
+1-在vs中链接到
MIN
,感谢您的努力,但您的答案不正确:在分组后,TOP 1将只返回1条记录(即,答案将只包含
A
B
)。
SELECT category, MIN(CAST(guid AS BINARY(16)))
FROM myTable
GROUP BY category
WITH CategoryValue
AS
(    
    SELECT category, MIN(CAST(guid AS BINARY(16)))
    FROM myTable
    GROUP BY category
)
SELECT category, CAST(guid AS UNIQUEIDENTIFIER)
FROM CategoryValue