2011-05-20 192 views
41

比方说,我有如下表:聚合函数(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,或创建一些嵌套的TOP 1 SQL,但这看起来像一个丑陋的解决方法。有没有我错过的优雅解决方案?

+0

你为什么要这么做?你可以直接使用'SELECT DISTINCT类别FROM myTable'吗?或者你真的需要每个类别的任意GUID? – verdesmarald 2011-05-20 08:38:24

+0

@veredesmarald:是的,我需要为每个类别使用一个任意的GUID。 – Heinzi 2011-05-20 08:41:19

回答

29

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

只投它作为一个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 
+4

您可以将其转换为字符串 - “MIN(CAST(guid AS VARCHAR(36)))' – dsp0549 2013-06-01 15:39:42

12

集合函数还可UNIQUEIDENTIFIER列被用于如果SQL Server版本> = 2012

表达

是常数,列名,或功能,和 算术的任何组合,按位和字符串运算符。 MIN可以与 数字,char,varchar,uniqueidentifier或日期时间列一起使用,但不包括带位列的 。聚合函数和子查询不允许使用 。

+2

+1 - 链接到[MIN2] [2008 R2](http://technet.microsoft.com/zh-cn/ us/library/ms179916(v = sql.105).aspx)vs [2012](http://technet.microsoft.com/en-us/library/ms179916(v = sql.110).aspx) – StuartLC 2014-02-22 06:24:17

-3

选择顶层1类,GUID FROM mytable的 GROUP BY类,GUID

+1

Thanks for努力,但你的答案是不正确的:在分组之后,TOP 1将只返回1条记录*(即,答案将只包含* * A *或*'B')。 – Heinzi 2014-11-16 09:26:32