2011-05-20 231 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