2016-08-18 18 views
0

我對sql相當陌生,並沉浸了一整天,試圖找出如何執行以下操作。我有3個表,看起來是這樣的:T-SQL:加入三個表並限制到最早遇到

表1
customer_id department_id start_dts 1 2 2011-07-23 14:30:00 3 1 2011-07-24 10:15:00 3 1 2011-08-18 11:14:00 2 3 2012-05-04 05:45:00 1 3 2010-06-09 15:20:00

表2

department_id deparment_nm 1 a 2 b 3 c

表3

customer_id customer_nm 1 betty 2 fred 3 dino

我想要生成最早的enco清單溫特對各部門和相關的客戶名稱的遭遇,使得它看起來像這樣(的部門的順序並不重要): department_nm customer_nm start_dts a dino 2011-07-24 10:15:00 b betty 2011-07-23 14:30:00 c betty 2010-06-09 15:20:00

我第一次試圖通過部門標識加入表2表1然後內部連接表3在customer_id上,並在select語句下使用start_dts的min函數,但是這給每個客戶在每個部門中首次遇到。然後,我嘗試了各種嵌套連接的迭代,並試圖使用over/partition子句來獲得我想要的,但我不認爲我正確地理解了這個概念。任何有識之士都非常感激。

回答

0
;with cte as (
select dept_nm, cust_nm, row_number() over (partition by t1.dept_id order by start_dts) rn, start_dts from table1 t1 
left join table2 t2 
on t1.dept_id = t2.dept_id 
left join table3 t3 
on t1.cust_id = t3.cust_id 
) select * from cte where rn=1 

不知道我理解正確的話您的要求..但看起來你想這樣的事情...

0

在實際細節上很稀少,但類似這樣的東西就是你要找的東西。這已被問及答覆數百次和數百次。

select department_nm 
    , customer_nm 
    , start_dts 
from 
(
    select department_nm 
     , customer_nm 
     , start_dts 
     , ROW_NUMBER() over(partition by t1.customer_id, t1.department_id order by t1.start_dts desc) as RowNum 
    from table1 t1 
    join table2 t2 on t2.department_id = t1.department_id 
    join table3 t3 on t3.customer_id = t1.customer_id 
) x 
where x.RowNum = 1 
+0

我不認爲你想'customer_id',他只想第一個客戶遇到的部門劃分..而且也爲了通過start_dts ASC – JamieD77

+0

感謝這兩個,非常喜歡。爲了阻止事情發生,並提出了很多次以前的問題 - 我做了搜索,但認爲我足夠的綠色,以至於我可能沒有找到有效的搜索方式。 – PetuniaBegunia

0

我覺得熱膨脹係數和窗函數矯枉過正這樣的事情。如果我理解正確,以下內容應該可以工作。

SELECT department_nm, customer_nm, MIN(start_dts) AS [start_dts] 
FROM 
(
    SELECT department_nm, customer_nm, start_dts 
    FROM Table1 t1 
    JOIN Table2 t2 ON t1.department_id = t2.department_id 
    JOIN Table3 t3 ON t1.customer_id = t2.customer_id 
) x 
GROUP BY department_nm, customer_nm