Sql Uniqueidentifier(GUID)上的聚合函数
假设我有下表:Sql Uniqueidentifier(GUID)上的聚合函数,sql,sql-server,guid,aggregate,uniqueidentifier,Sql,Sql Server,Guid,Aggregate,Uniqueidentifier,假设我有下表: category | guid ---------+----------------------- A | 5BC2... A | 6A1C... B | 92A2... 基本上,我要执行以下SQL操作: SELECT category, MIN(guid) FROM myTable GROUP BY category 它不一定是MIN。我只想返回每个类别的一个GUID。我不管是哪一个。不幸的是,SQL Server不允许在GU
category | guid
---------+-----------------------
A | 5BC2...
A | 6A1C...
B | 92A2...
基本上,我要执行以下SQL操作:
SELECT category, MIN(guid)
FROM myTable
GROUP BY category
它不一定是MIN。我只想返回每个类别的一个GUID。我不管是哪一个。不幸的是,SQL Server不允许在GUID上使用最小值或最大值
当然,我可以将guid转换为varchar,或者创建一些嵌套的TOP 1 SQL,但这似乎是一个丑陋的解决方法。有没有我错过的优雅解决方案 假设您使用的是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
如果您使用的是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
只需将其转换为
二进制(16)
如有必要,您可以稍后将其放回
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列上使用聚合函数 表情 是常量、列名或函数,以及 算术运算符、位运算符和字符串运算符。MIN可以与 numeric、char、varchar、uniqueidentifier或datetime列,但不包括 具有位列。不支持聚合函数和子查询 允许
选择前1个类别,guid 从myTable
按类别分组,guid为什么要这样做?您是否可以使用
从myTable
中选择不同的类别?或者您真的需要每个类别的任意GUID吗?@Veredesmarld:是的,我需要每个类别的任意GUID。您可以将其转换为字符串-MIN(强制转换(GUID为VARCHAR(36))
+1-在vs中链接到MIN
,感谢您的努力,但您的答案不正确:在分组后,TOP 1将只返回1条记录(即,答案将只包含A
或B
)。
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