如何选择具有最大和最小计数的行?

cub*_*729 1 sql-server aggregate count sql-server-2012

我在 SQL Server 2012 中有下表:

CREATE TABLE [MyTable] (
    [Id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY DEFAULT NEWID(),
    [MyGroup] INT NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

我想输出表格的表格

    | MyGroup | Count
Max |         |
Min |         |
Run Code Online (Sandbox Code Playgroud)

例如,如果我30在MyTable的行,其中MyGroup的= 120行,其中MyGroup的= 2,和10行,其中MyGroup的= 3,然后

    | MyGroup | Count
Max | 1       | 30
Min | 3       | 10
Run Code Online (Sandbox Code Playgroud)

什么样的查询会输出这些信息?

Mar*_*ith 7

这是 Travis 答案的另一种表述,它避免了对COUNT两个方向进行排序的需要。

WITH s
     AS (SELECT MyGroup,
                Count(MyGroup)              AS [Count],
                MAX(Count(MyGroup)) OVER () AS [MaxMyGroup],
                MIN(Count(MyGroup)) OVER () AS [MinMyGroup]
         FROM   MyTable
         GROUP  BY MyGroup)
SELECT Agg,
       MyGroup,
       V.[Count]
FROM   s
CROSS APPLY (VALUES ( 'Max', CASE WHEN [Count] = [MaxMyGroup] THEN [Count] END),
                     ('Min', CASE WHEN [Count] = [MinMyGroup] THEN [Count] END))
             V(Agg, [Count])
WHERE V.[Count] IS NOT NULL       
Run Code Online (Sandbox Code Playgroud)


Tra*_*vis 6

WITH s AS (
  SELECT MyGroup, Count(MyGroup) AS [Count], 
  RANK() OVER (ORDER BY Count(MyGroup)) AS [rasc],
  RANK() OVER (ORDER BY Count(MyGroup) DESC) AS [rdesc]
FROM MyTable
GROUP BY (MyGroup)
)
SELECT 
  CASE 
    WHEN [rasc] = 1 THEN 'Min'
    ELSE 'Max' 
  END AS 'Agg',
  [MyGroup], 
  [Count]
FROM s
WHERE [rasc] = 1 OR [rdesc] = 1
Run Code Online (Sandbox Code Playgroud)

SQLFiddle

更新: 马丁的替代方案非常有效。

这是马丁解决方案的另一种类似方法,

WITH s AS (
SELECT MyGroup, Count(MyGroup) AS [Count], 
  MAX(Count(MyGroup)) OVER () AS [Max],
  MIN(Count(MyGroup)) OVER () AS [Min]
FROM MyTable
GROUP BY MyGroup
)
SELECT 
  CASE 
    WHEN [Count] = [Max] THEN 'Max'
    ELSE 'Min' 
  END AS [Agg],
  [MyGroup], 
  [Count]
FROM s
WHERE [Count] IN ([Max], [Min]);
Run Code Online (Sandbox Code Playgroud)