2016-08-18 2 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

Я хочу, чтобы генерировать список самых ранних энко унтер для каждого отдела и связанного с именем клиента для встречи таким образом, что это будет выглядеть примерно так (приказ отдела не имеет значения): 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, DEPARTMENT_ID затем внутренняя таблица соединения 3 на customer_id и использование функции min для start_dts в выражении select, но это дает мне каждую первую встречу клиентов в каждом отделе. Затем я попробовал различные итерации вложенных объединений и попытался использовать условие 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 
Смежные вопросы