Sql 从包含最大值的行中选择其他列

Sql 从包含最大值的行中选择其他列,sql,sql-server,tsql,Sql,Sql Server,Tsql,我的查询如下所示: SELECT [ScriptName] ,[BranchName] ,AVG([XMLColumn].value('count(//data)', 'int')) ,MIN([XMLColumn].value('count(//data)', 'int')) ,MAX([XMLColumn].value('count(//data)', 'int')) FROM temp GROUP BY [

我的查询如下所示:

  SELECT     [ScriptName]
        ,[BranchName]
        ,AVG([XMLColumn].value('count(//data)', 'int'))
        ,MIN([XMLColumn].value('count(//data)', 'int'))
        ,MAX([XMLColumn].value('count(//data)', 'int'))
  FROM temp
  GROUP BY [BranchName], [ScriptName]
ScriptName | BranchName | XMLLog | Developer | Revision
ScriptName | BranchName | Average | Min | MAX
-------------------------------------------------
Script 1   | trunk      |  80     | 11  | 120
Script 2   | branch1    |  15     | 11  | 21
ScriptName | BranchName | Average | Min | MAX  | DeveloperWhoCausedMinimum | DeveloperWhoCausedMaximum
-----------------------------------------------------------------------------------------------------------------
Script 1   | trunk      |  80     | 11  | 120  |      me                   |     The Boss
Script 2   | branch1    |  15     | 11  | 21   |      me                   |     The Boss
我要查询的表的结构如下:

  SELECT     [ScriptName]
        ,[BranchName]
        ,AVG([XMLColumn].value('count(//data)', 'int'))
        ,MIN([XMLColumn].value('count(//data)', 'int'))
        ,MAX([XMLColumn].value('count(//data)', 'int'))
  FROM temp
  GROUP BY [BranchName], [ScriptName]
ScriptName | BranchName | XMLLog | Developer | Revision
ScriptName | BranchName | Average | Min | MAX
-------------------------------------------------
Script 1   | trunk      |  80     | 11  | 120
Script 2   | branch1    |  15     | 11  | 21
ScriptName | BranchName | Average | Min | MAX  | DeveloperWhoCausedMinimum | DeveloperWhoCausedMaximum
-----------------------------------------------------------------------------------------------------------------
Script 1   | trunk      |  80     | 11  | 120  |      me                   |     The Boss
Script 2   | branch1    |  15     | 11  | 21   |      me                   |     The Boss
目前,我的结果查询生成如下输出:

  SELECT     [ScriptName]
        ,[BranchName]
        ,AVG([XMLColumn].value('count(//data)', 'int'))
        ,MIN([XMLColumn].value('count(//data)', 'int'))
        ,MAX([XMLColumn].value('count(//data)', 'int'))
  FROM temp
  GROUP BY [BranchName], [ScriptName]
ScriptName | BranchName | XMLLog | Developer | Revision
ScriptName | BranchName | Average | Min | MAX
-------------------------------------------------
Script 1   | trunk      |  80     | 11  | 120
Script 2   | branch1    |  15     | 11  | 21
ScriptName | BranchName | Average | Min | MAX  | DeveloperWhoCausedMinimum | DeveloperWhoCausedMaximum
-----------------------------------------------------------------------------------------------------------------
Script 1   | trunk      |  80     | 11  | 120  |      me                   |     The Boss
Script 2   | branch1    |  15     | 11  | 21   |      me                   |     The Boss
我想在结果表中添加两列:包含最小值的行中的开发人员和包含最大值的行中的开发人员。这将导致查询的输出如下所示:

  SELECT     [ScriptName]
        ,[BranchName]
        ,AVG([XMLColumn].value('count(//data)', 'int'))
        ,MIN([XMLColumn].value('count(//data)', 'int'))
        ,MAX([XMLColumn].value('count(//data)', 'int'))
  FROM temp
  GROUP BY [BranchName], [ScriptName]
ScriptName | BranchName | XMLLog | Developer | Revision
ScriptName | BranchName | Average | Min | MAX
-------------------------------------------------
Script 1   | trunk      |  80     | 11  | 120
Script 2   | branch1    |  15     | 11  | 21
ScriptName | BranchName | Average | Min | MAX  | DeveloperWhoCausedMinimum | DeveloperWhoCausedMaximum
-----------------------------------------------------------------------------------------------------------------
Script 1   | trunk      |  80     | 11  | 120  |      me                   |     The Boss
Script 2   | branch1    |  15     | 11  | 21   |      me                   |     The Boss

我不知道从哪里开始。谢谢

下面使用窗口函数来计算这三个值。然后选择具有最大值的整行:

select t.*, avgval, minval, maxval
from (select t.*,
             avg([XMLColumn].value('count(//data)', 'int') over
                 (partition by BranchName, ScriptName) as avgval,
             min([XMLColumn].value('count(//data)', 'int') over
                 (partition by BranchName, ScriptName) as minval,
             max([XMLColumn].value('count(//data)', 'int') over
                 (partition by BranchName, ScriptName) as maxval
      from temp t
     ) t
where [XMLColumn].value('count(//data)', 'int') = maxval;
注意:如果多行具有最大值,您将得到多行。如果您只需要一个,请使用
行编号()

编辑:

哦,你把问题改成两行一列,而不是一列两行

使用相同的想法,但使用聚合:

select BranchName, ScriptName, minval, avgval, maxval,
       avg([XMLColumn].value('count(//data)', 'int') as avgval,
       min([XMLColumn].value('count(//data)', 'int') as minval,
       max([XMLColumn].value('count(//data)', 'int') as maxval,
       max(case when seqnum = 1 then Developer end) as minDeveloper,
       max(case when seqnum = cnt then Developer end) as maxDeveloper
from (select t.*,
             row_number() over (partition by BranchName, ScriptName
                                order by [XMLColumn].value('count(//data)', 'int')
                               ) as seqnum,
             count(*) over (partition by BranchName, ScriptName) as cnt
      from temp t
     ) t
group by BranchName, ScriptName;

我编辑了我的问题,以反映为什么我没有接受这个作为答案(因为它为每个分支生成多行,不允许区分生成最大值和最小值的开发人员)。