唯一标识符(GUID)上的聚合函数

假设我有下面的表格:

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

基本上,我想要做以下的SQL:

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

它不一定是MIN。 我只想返回每个类别的一个 GUID。 我不在乎哪一个。 不幸的是,SQL Server在GUID上不允许MIN或MAX。

当然,我可以将guid转换成varchar,或者创build一些嵌套的TOP 1 SQL,但是这看起来像一个丑陋的解决方法。 有没有我错过了一些优雅的解决scheme?

假设您正在使用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 

把它当作一个BINARY(16)

 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 

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

expression

是常量,列名称或函数,以及算术,位运算符和string运算符的任意组合。 MIN可以与数字,char,varchar,uniqueidentifier或datetime列一起使用,但不能与位列一起使用。 聚合函数和子查询是不允许的。

 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 

如果你在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 

SELECT top 1类别,guid FROM myTable GROUP BY类别,guid