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