2013-07-28 76 views
1

我知道標題沒有說太多,但讓我解釋一下我的情況,根據數值選擇頂層1:SQL - 從兩列

我有如下表:

enter image description here

現在,我想從每個部門中選擇前1名,但我不想獲取重複的職位ID,因此我希望每個部門的頂級員工按項目數量排列,但職位ID不同。結果是突出顯示的行。

+1

第二個突出顯示的行有可能是錯的嗎?它不應該是EmplyeeID 580824 DepID 484646(其中有52個項目)嗎?也許我誤解了這個問題。 – Franco

+0

你說得對。對不起。在這種情況下,EmplyeeID 580824將被選中。我錯過了。 – Mike

回答

1

您不能保證返回的職位是最好的。一個職位可能是兩個部門中最好的,在這種情況下,其中一個結果約束需要放寬。

所以,這裏有一種方法可以獲得排名最高但部分不同的部分(也許是全部)部門。首先選擇每個部門中排名最高的員工。這些是項目最多的一個。

然後,對於每個PositionTypeId,從這些替代方案中選擇一個隨機部門。然後,爲每個部門選擇一個隨機的職位類型。下面的查詢採取了這種辦法:

select DepID, EmplyeeID, PositionTypeId, NumProjects 
from (select t.*, row_number() over (partition by DepId order by newid()) as seqnum 
     from (select t.*, row_number() over (partition by PositionTypeId order by newid()) as position_seqnum 
      from (select t.*, 
         dense_rank() over (partition by DepId order by NumProducts desc 
              ) as rank_seqnum 
        from t 
       ) t 
      where rank_seqnum = 1 
      ) t 
     where position_seqnum = 1 
    ) t 
where seqnum = 1; 

這是保證返回的行每個部門。但是,保證返回的所有部門都會有不同的職位類型,而且這些行對於該部門來說是最好的。你或許可以努力調整中間步驟,以確保更大範圍的部門。但是,因爲問題不能保證有解決方案,所以這種調整可能比他們的價值更大。

+0

不完全是我需要的,但是它完成了這項工作。謝謝!! – Mike