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

Posted

技术标签:

【中文标题】唯一标识符 (GUID) 上的聚合函数【英文标题】:Aggregate Function on Uniqueidentifier (GUID) 【发布时间】:2011-08-29 11:43:05 【问题描述】:

假设我有下表:

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? @veredesmarald:是的,我需要每个类别的任意 GUID。 【参考方案1】:

假设您使用的是 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

【讨论】:

【参考方案2】:
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   

【讨论】:

【参考方案3】:

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

【讨论】:

您可以将其转换为字符串 - MIN(CAST(guid AS VARCHAR(36)))【参考方案4】:

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

表达式

是一个常量、列名或函数,以及它们的任意组合 算术、按位和字符串运算符。 MIN 可以与 numeric、char、varchar、uniqueidentifier 或 datetime 列,但不是 与位列。聚合函数和子查询不是 允许。

【讨论】:

+1 - 在2008 R2 与2012 中链接到MIN 【参考方案5】:

选择前 1 个类别,guid 从我的表 GROUP BY 类别,指导

【讨论】:

感谢您的努力,但您的答案不正确:TOP 1 分组后将仅返回 1 条记录(即答案将仅包含 either A B)。

以上是关于唯一标识符 (GUID) 上的聚合函数的主要内容,如果未能解决你的问题,请参考以下文章

GUID (全局唯一标识符)

全球唯一标识GUID

数据库C#Java生成唯一GUID 方法

GUID (全局唯一标识符)

全球唯一标识符:GUID在线生成

GUID全局唯一标识符