2011-09-29 59 views
3

查询:查询来获取多行的一个条目

select machinename, StatusCode, max(size) as size, statusID 
from machine where MachineID In('33','22') and StatusCode = 166 
group by machinename, StatusCode, statusID 
order by max(size) DESC 

结果:

machinename StatusCode size statusID 
    ----------- ---------- ---- -------- 
    test1  166   50  1 
    test1  166   25  2 
    test2  166   75  3 
    test2  166   48  4 

要求:

我需要显示每个只有一个入口机。 我必须通过如上所示取两个条目之间的最大值来做到这一点。 像TEST1我有两个尺寸在50和25我必须表明其具有50行和忽略其具有25.

由于

所需的结果列:

machinename StatusCode size statusID 
    ----------- ---------- ---- -------- 
    test1  166   50  1 
    test2  166   75  3 
+0

谢谢约翰。即将解决它..这很快.. :) – user175084

+0

statusid是唯一的关键 – user175084

+1

+1首先看,我认为这将是非常简单的,但我不明白,没有使用某种形式的马克的解! –

回答

3
SELECT machinename, StatusCode, size, statusID 
FROM (
    SELECT 
     machinename, 
     StatusCode, 
     size, 
     statusID, 
     ROW_NUMBER() OVER (PARTITION BY MachineID ORDER BY size DESC) AS rn 
    FROM machine 
    WHERE MachineID IN ('33','22') 
    AND StatusCode = 166 
) T1 
WHERE rn = 1 
ORDER BY size DESC 
+0

这工作完美,你能解释我的“ROW_NUMBER()OVER(PARTITION BY机器ID ORDER BY大小DESC)如”如果你不介意。就像它在做什么 – user175084

2

“老”SQL Server的三种解决方案s

SELECT * 
FROM TestData a 
WHERE a.Size >= ALL(SELECT b.Size FROM TestData b WHERE b.MachineName=a.MachineName); 

SELECT * 
FROM TestData a 
WHERE a.Size = (SELECT MAX(b.Size) FROM TestData b WHERE b.MachineName=a.MachineName); 

SELECT a.* 
FROM TestData a 
JOIN (SELECT MachineName, MAX(Size) MaxSize FROM TestData GROUP BY MachineName) b 
ON  a.MachineName=b.MachineName 
AND  a.Size=b.MaxSize; 

结果:

MachineName StatusCode Size  StatusID 
----------- ----------- ----------- ----------- 
test2  166   75   3 
test1  166   50   1 

警告:如果有与一台机器一样最大值许多行,那么所有这些查询会显示这些行。

+0

+1对于'ALL'还有关于它如何处理关系的说明 –