2016-12-07 40 views
3

大多數人都希望得到最大值,但我需要一個範圍內的最大值加上附加數據。例如,我有一個團隊及其經理和他們的經理ID列表。我在谷歌/ stackoverflow看,但大多數人只想要最大值,但我也需要額外的列,這就是爲什麼我問這個問題。SQL Server:通過附加數據獲取一系列值之間的最大值

表1

team mgr_level mgr_id 
----------------------- 
aa  1   111 
aa  2   222 
aa  3   333 
bb  1   111 
bb  2   222 
cc  1   111 
cc  2   222 
cc  3   444 
cc  4   888 

表2

employee  emp_id team 
------------------------------ 
smith, mary  23  aa 
jones, john  34  bb 
ramjet, roger 98  cc 
james, adam  111 mgr_team 
green, rachel 222 mgr_team 
bruin, breezly 333 mgr_team 
runner, road  444 mgr_team 
potter, harry 888 mgr_team 

我需要選擇最大(mgr_id)是222和444與其他數據(團隊和mgr_id)之間。

需要的結果如下所示。有辦法一步完成,而不是分兩步?

name   team primary_mgr_id manager_name 
----------------------------------------------- 
smith, mary  aa  333   bruin, breezly 
jones, john  bb  222   green, rachel 
ramjet, roger cc  444   runner, road 

我想這和SQL Server會爲每名返回多個行:我究竟做錯了什麼?

select max(mgr_id) as [primary_mgr_id], t2.employee, t1.mgr_id 
from table2 t2 
inner join table1 t1 on t2.team = t2.team 
group by t2.employee, t1.mgr_id 

謝謝你的幫忙。 Sven

+0

我加入吧!謝謝我忘了添加它 – Sven

回答

0

一種選擇是用ROW_NUMBER(的幫助)

Select Name = A.Employee 
     ,A.Team 
     ,primary_mgr_id = B.Mgr_ID 
     ,manager_name = B.manager_name 
From Table2 A 
Join (
     Select A.* 
       ,manager_name = employee 
       ,RN = Row_Number() over (Partition By A.Team Order by A.mgr_level desc) 
     From Table1 A 
     Join Table2 B on (A.Mgr_ID=B.Emp_ID) 
     Where mgr_id between 222 and 444 
    ) B on A.Team=B.Team and B.RN=1 

返回

Name   Team primary_mgr_id manager_name 
smith, mary  aa  333    bruin, breezly 
jones, john  bb  222    green, rachel 
ramjet, roger cc  444    runner, road 

另一種選擇是使用一個十字架PPLY

Select Name = A.Employee 
     ,A.Team 
     ,primary_mgr_id = B.Mgr_ID 
     ,manager_name = B.employee 
From Table2 A 
Cross Apply (
     Select Top 1 C.*,D.employee 
     From Table1 C 
     Join Table2 D on (emp_id = mgr_id) 
     where C.Team=A.Team and mgr_id between 222 and 444 Order by mgr_level desc 
    ) B 
0

這是你之後的那個嗎?

SELECT 
    employee AS name, team, max_mgr_id AS primary_mgr_id, t3.employee as manager_name 
FROM 
    table2 t2 
JOIN (
    SELECT team, MAX(mgr_id) AS max_mgr_id 
    FROM table1 
) t1 ON t2.team = t1.team 
JOIN table2 t3 ON t3.emp_id = t1.max_mgr_id AND t3.team = 'mgr_team' 
0

我會做這個作爲使用outer apply

select t2.*, t1.mgr_id as primary_mgr_id , t1.name as manager_name 
from table2 t2 outer apply 
    (select t1.mgr_id, tt2.name 
     from table1 t1 join 
      table2 tt2 
      on t1.mgr_id = tt2.emp_id 
     where t1.team = t2.team and 
      t1.mgr_id between 222 and 444 
     order by t1.mgr_id desc 
    ) t1; 
相關問題