2014-03-25 41 views
1

两张表。一个包含项目列表,另一个包含项目的阶段。 我需要展示项目的最新阶段。 的SQL我此刻正显示所有阶段,看起来是这样的:加入限制结果

SELECT 
    a.proj_name, 
    a.proj_phase, 
    c.proj_actions_next_action, 
    c.proj_actions_next_action_date 
FROM 
    projects a 
LEFT OUTER JOIN 
    Projects_actions c 
     ON a.proj_id = c.proj_actions_projects_link 
LEFT OUTER JOIN 
    Clients b 
     ON a.proj_clientlink = b.client_id 
ORDER BY b.clientname 

输出看起来是这样的:

proj_name | proj_phase | proj_actions_next_action | proj_actions_next_action_date 
Denmark | Active  | Call X person   | 1/1/2014 
Denmark | Active  | Call Y person   | 2/1/2014 
Denmark | Active  | Do this presentation  | 3/1/2014 
Denmark | Active  | Sell this product  | 4/1/2014 
UK Asset | Active  | Call Y person   | 1/2/2014 
UK Asset | Active  | Call X person   | 1/3/2014 
UK Asset | Active  | Call Y person   | 2/4/2014 
UK Asset | Active  | Do this presentation  | 3/5/2014 
UK Asset | Active  | Sell this product  | 4/6/2014 

我希望它看起来是这样的:(只显示最新的proj_actions_next_action_date)

proj_name | proj_phase | proj_actions_next_action | proj_actions_next_action_date 
Denmark | Active  | Sell this product  | 4/1/2014 
UK Asset | Active  | Sell this product  | 4/6/2014 

谢谢大家!

+0

刚刚得到的最大(日期)出来。 – Divya

回答

4
SELECT Q.proj_name, 
     Q.proj_phase, 
     Q.proj_actions_next_action, 
     Q.proj_actions_next_action_date 
FROM (
SELECT 
    a.proj_name, 
    a.proj_phase, 
    c.proj_actions_next_action, 
    c.proj_actions_next_action_date, 
    ROW_NUMBER() OVER (PARTITION BY a.proj_name 
      ORDER BY c.proj_actions_next_action_date DESC) AS RN 
    ,b.clientname 

FROM 
    projects a 
LEFT OUTER JOIN 
    Projects_actions c 
     ON a.proj_id = c.proj_actions_projects_link 
LEFT OUTER JOIN 
    Clients b 
     ON a.proj_clientlink = b.client_id 
    )Q 
WHERE Q.RN = 1 
ORDER BY Q.clientname 
+2

+1。击败我! –

+1

我也是!顺便说一句,它似乎并不使用“客户”表。 – Szymon

+0

它使用客户端表格为每个客户端订购结果。 –

0
;with cte1 as 
(
SELECT 
    a.proj_name, 
    a.proj_phase, 
    c.proj_actions_next_action, 
    c.proj_actions_next_action_date 
FROM 
    projects a 
LEFT OUTER JOIN 
    Projects_actions c 
     ON a.proj_id = c.proj_actions_projects_link 
LEFT OUTER JOIN 
    Clients b 
     ON a.proj_clientlink = b.client_id 
ORDER BY b.clientname 
), 
cte2 as 

(
    ROW_NUMBER() OVER(PARTITION BY proj_name ORDER BY proj_actions_next_action_date DESC) AS Row, 
    * 
    from cte1 

) 

select * from cte2 
where Row =1