唯一标识符 (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 条记录(即答案将仅包含 eitherA
或 B
)。以上是关于唯一标识符 (GUID) 上的聚合函数的主要内容,如果未能解决你的问题,请参考以下文章