唯一标识符(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