2015-12-02 83 views
1

我将以下查询作为子查询。我需要每siteid带回一个记录,最大数量为grossinternalarea。麻烦是这不起作用,可能有多个buildingid与最大grossinternalarea相同。我必须包含buildingid,因为这会在随后的加入中使用。如果你看看结果列表,你会看到一个siteid重复,行3 & 4. 我怎么才能返回一个buildingIDs?我不在乎哪一个..每组返回单个记录,最大值为

SELECT A.SiteID 
    , a.buildingid 
    , A.BuildYear 
    , A.GrossInternalArea 

    FROM 
    qrySiteBuildingGrossExternalArea A 
    LEFT JOIN qrySiteBuildingGrossExternalArea B 
    ON A.SiteID = B.SiteID AND isnull(A.GrossInternalArea, 0) < isnull(B.GrossInternalArea, 0) 
    WHERE 
    isnull(A.GrossInternalArea, 0) <> 0 
    AND B.GrossInternalArea IS NULL 
    ORDER BY 
    A.SiteID 
    , A.BuildingID 

enter image description here

+0

它是SITEID或buildingID和图像被切断。 – Paparazzi

回答

0

嵌入在另外一个子查询和使用row_number

... 
SELECT * 
FROM (SELECT A.SiteID , 
        a.buildingid , 
        A.BuildYear , 
        A.GrossInternalArea , 
        ROW_NUMBER() OVER (PARTITION BY A.SiteID ORDER BY A.GrossInternalArea DESC) rn 
      FROM  qrySiteBuildingGrossExternalArea A 
        LEFT JOIN qrySiteBuildingGrossExternalArea B ON A.SiteID = B.SiteID 
                   AND ISNULL(A.GrossInternalArea, 
                   0) < ISNULL(B.GrossInternalArea, 
                   0) 
      WHERE  ISNULL(A.GrossInternalArea, 0) <> 0 
        AND B.GrossInternalArea IS NULL 
     ) t 
WHERE rn = 1 
... 
+0

为了防止其他人使用这个,我在子查询中取出了该命令。惊人的快速回答乔治! – WelshLady

+0

@WelshLady,是的订购条款会产生错误。我已经删除了。 –

0

一个简单的方法来解决,这是不使用该查询作为一个子查询。

而不是做的:

select * 
from table1 
join subquery 
    on ... 

select * 
from table1 t1 
cross apply (
    SELECT 
     top 1 -- need this to filter only one (the biggest one) 
     A.SiteID 
    , a.buildingid 
    , A.BuildYear 
    , A.GrossInternalArea 

    FROM 
     qrySiteBuildingGrossExternalArea A 
    LEFT JOIN qrySiteBuildingGrossExternalArea B 
      ON A.SiteID = B.SiteID AND isnull(A.GrossInternalArea, 0) < isnull(B.GrossInternalArea, 0) 
    WHERE 
     isnull(A.GrossInternalArea, 0) <> 0 
     AND B.GrossInternalArea IS NULL 
     and A.SiteID = t1.SiteID -- you'll need this to link to the outer query 
     and A.BuildingID = t1.BuildingID -- you'll probably need this to link to the outer query 
    order by a.GrossInternalArea desc -- use this to get the max one 
) xx -- give a name here to use in the query