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

48
Column 1 Column 2 Column 3
Row 1, Column 1 Row 1, Column 2 Row 1, Column 3
Row 2, Column 1 Row 2, Column 2 Row 2, Column 3
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,或者创建一些嵌套的TOP 1 SQL语句,但这似乎是一种丑陋的解决方法。是否有我错过的一些优雅的解决方案?


你为什么要这样做?你能不能只使用 SELECT DISTINCT category FROM myTable 代替呢?或者你真的需要每个类别一个任意 GUID 吗? - verdesmarald
@veredesmarald:是的,我需要每个类别一个任意GUID。 - Heinzi
5个回答

50

将其转换为 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

6
你可以将其转换为字符串 - MIN(CAST(guid AS VARCHAR(36))) - J Webb

31

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

19

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

expression

是一个常量、列名或函数,可以使用任何组合的算术、位和字符串运算符。MIN可用于数字、char、varchar、uniqueidentifier或datetime列,但不能用于bit列。不允许使用聚合函数和子查询。


4
在2008 R2和2012中,与MIN函数的链接分别为:2008 R22012 - StuartLC

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

如果您使用的是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   

-4

从 myTable 中选择 top 1 类别和 guid 按类别和 guid 进行分组


1
感谢您的努力,但是您的答案是不正确的:TOP 1 仅在分组后返回一条记录(即,答案将只包含 AB 中的一个)。 - Heinzi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接