【问题标题】:Aggregate Function on Uniqueidentifier (GUID)唯一标识符 (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。

标签: sql sql-server guid aggregate uniqueidentifier


【解决方案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 列,但不是 与位列。聚合函数和子查询不是 允许。

      【讨论】:

      【解决方案5】:

      选择前 1 个类别,guid 从我的表 GROUP BY 类别,指导

      【讨论】:

      • 感谢您的努力,但您的答案不正确:TOP 1 在分组后将仅返回 1 条记录(即答案将仅包含 either A 或 B)。
      猜你喜欢
      • 2010-11-28
      • 2014-02-28
      • 1970-01-01
      • 1970-01-01
      • 2016-10-18
      • 2012-04-01
      • 2010-10-23
      • 2018-03-03
      • 1970-01-01
      相关资源
      最近更新 更多