2013-01-08 41 views
1

行我有以下查詢:選擇有MAX計數器

Select MAX("Counter") as "Counter", "DestinationId" FROM (   
Select t1."Counter", t2.* From 
      (SELECT "HierarchyNodeId", (SELECT "Description" 
      FROM "Destination" 
      WHERE "DestinationId" = hn."DestinationId") "Description", "DestinationId", 
     (SELECT "DestinationTypeId" 
      FROM "Destination" 
      WHERE "DestinationId" = hn."DestinationId") "DestinationTypeId" 
    FROM "HierarchyNode" hn 
WHERE "DestinationId" IN (SELECT "DestinationId" From(SELECT COUNT ("HierarchyNodeId"), "DestinationId" FROM "HierarchyNode" GROUP BY "DestinationId" HAVING COUNT ("HierarchyNodeId") > 1))) t2, 
(select COUNT (*) "Counter", "HierarchyNodeId" From "HierarchyDetail" 
Group By "HierarchyNodeId") t1 
Where t1."HierarchyNodeId" = t2."HierarchyNodeId" 
ORDER BY "DestinationId", "Counter" Desc 
) 
GROUP BY "DestinationId" 

輸出顯示最大反每個目標ID。 我需要的額外信息是對應於該特定行的HierarchyId(使用該特定目標ID和計數器)。

如果我將其更改爲:

Select MAX("Counter") as "Counter", "DestinationId", "HierarchyId" FROM (.... 

,因爲我沒有在GROUP BY包括HierarchyId的我得到一個錯誤。但是,如果我爲每個DestinationId - HierarchyId組合(不是每個DestinationId)都包含一個最大計數器。

所以,我想這一點:

Select * From (
Select t1."Counter", t2.* From 
      (SELECT "HierarchyNodeId", (SELECT "Description" 
      FROM "Destination" 
      WHERE "DestinationId" = hn."DestinationId") "Description", "DestinationId", 
     (SELECT "DestinationTypeId" 
      FROM "Destination" 
      WHERE "DestinationId" = hn."DestinationId") "DestinationTypeId" 
    FROM "HierarchyNode" hn 
WHERE "DestinationId" IN (SELECT "DestinationId" From(SELECT COUNT ("HierarchyNodeId"), "DestinationId" FROM "HierarchyNode" GROUP BY "DestinationId" HAVING COUNT ("HierarchyNodeId") > 1))) t2, 
(select COUNT (*) "Counter", "HierarchyNodeId" From "HierarchyDetail" 
Group By "HierarchyNodeId") t1 
Where t1."HierarchyNodeId" = t2."HierarchyNodeId" 
ORDER BY "DestinationId", "Counter" Desc 
) test1 
Inner Join 
(
Select MAX("Counter") as "Counter", "DestinationId" FROM (   
Select t1."Counter", t2.* From 
      (SELECT "HierarchyNodeId", (SELECT "Description" 
      FROM "Destination" 
      WHERE "DestinationId" = hn."DestinationId") "Description", "DestinationId", 
     (SELECT "DestinationTypeId" 
      FROM "Destination" 
      WHERE "DestinationId" = hn."DestinationId") "DestinationTypeId" 
    FROM "HierarchyNode" hn 
WHERE "DestinationId" IN (SELECT "DestinationId" From(SELECT COUNT ("HierarchyNodeId"), "DestinationId" FROM "HierarchyNode" GROUP BY "DestinationId" HAVING COUNT ("HierarchyNodeId") > 1))) t2, 
(select COUNT (*) "Counter", "HierarchyNodeId" From "HierarchyDetail" 
Group By "HierarchyNodeId") t1 
Where t1."HierarchyNodeId" = t2."HierarchyNodeId" 
ORDER BY "DestinationId", "Counter" Desc 
) 
GROUP BY "DestinationId" 
) test2 
On test1."DestinationId" = test2."DestinationId" 
And test1."Counter" = test2."Counter" 

這一次給了我1456個記錄時先查詢給了我1256 ...... 但我只想要1個HierachyNodeId第一個查詢的每一行。所以它沒有意義。 它應該是1256行。

回答

2

使用keep dense_rank

Select 
    MAX("Counter") as "Counter", 
    "DestinationId" 
    max("HierarchyId") keep (dense_rank first order by counter desc) as "HierarchyId" 
FROM (query) 
GROUP BY "DestinationId"; 
+0

的作品就像一個魅力感謝你;) –