Let\'s say I have the following table:
category | guid
---------+-----------------------
A | 5BC2...
A | 6A1C...
B | 92A2...
Assuming you're using SQL Server 2005 or later:
;with Numbered as (
select category,guid,ROW_NUMBER() OVER (PARTITION BY category ORDER BY guid) rn
from myTable
)
select * from Numbered where rn=1
Just cast it as a BINARY(16)
.
SELECT category, MIN(CAST(guid AS BINARY(16)))
FROM myTable
GROUP BY category
You can cast it back later if necessary.
WITH CategoryValue
AS
(
SELECT category, MIN(CAST(guid AS BINARY(16)))
FROM myTable
GROUP BY category
)
SELECT category, CAST(guid AS UNIQUEIDENTIFIER)
FROM CategoryValue
Aggregate functions can be used on Uniqueidentifier columns if SQL Server Version >= 2012
expression
Is a constant, column name, or function, and any combination of arithmetic, bitwise, and string operators. MIN can be used with numeric, char, varchar, uniqueidentifier, or datetime columns, but not with bit columns. Aggregate functions and subqueries are not permitted.
SELECT top 1 category, guid FROM myTable GROUP BY category,guid
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
If you are on SQL Server 2000 you could to this
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