2015-06-02 4 views
1
**Table Employee** 

Id Name 
1  EmpName1 
2  EmpName2 
3  EmpName3 

**Table EmpDeptHistory** 

Id EmpId Dept  Date 
1  1  Housing  2015-03-02 
2  2  Finance  2015-01-03 
3  1  WareHouse 2015-05-02 
4  2  Housing  2015-02-06 
5  3  WareHouse 2015-02-02 
6  1  Housing  2015-05-01 
7  2  Finance  2015-01-02 
8  2  Housing  2015-05-04 
9  2  Finance  2015-05-02 
10 1  WareHouse 2015-03-08 
11 1  Housing  2015-02-20 

Мне нужно найти недавний отдел, с которым работал каждый сотрудник. Также мне нужно найти для каждого работника, передав EmpIdВнутреннее соединение с одним рядом другого стола

Следующий запрос возвращает только один сотрудник, а не все :(

SELECT e.id, edh.dept,edh.date 
FROM Employee e 
    inner join (select top 1 eh.empid, eh.dept, eh.date 
       from EmpDeptHistory eh 
       order by eh.date desc) as edh 
    on e.id=edh.empid 

да, я понимаю, вершина 1 даст EMP идентификатор на основе даты, следовательно, только один деталь работника шоу. Я не уверен, как получить весь недавний отдел персонала.

select e.id,edh.dept,edh.date 
from employee e 
    inner join EmpDeptHistory edh 
    on e.id = (Select eh.empid, eh.dept, eh.date 
       from EmpDeptHistory eh 
       where e.id=eh.empid 
       order by eh.date desc) 

выше бросает

Предложение ORDER BY недействительно в представлениях, встроенных функциях, полученных таблицах, подзапросах и общих табличных выражениях, если не указано TOP, OFFSET или FOR XML.

+0

Что такое 'недавний отдел'? –

+0

@GiorgiNakeuri - отдел, с которым недавно работал сотрудник, основанный на Дате. Для emp id 1 склад является последним департаментом. (Id-3 во второй таблице) –

+0

Под «недавним делом» вы имеете в виду последний/последний отдел, над которым работал сотрудник? –

ответ

3

Вы можете использовать CROSS APPLY запустить правый подзапрос один раз для каждого левого ряда:

SELECT e.id, edh.dept,edh.date 
FROM Employee e cross apply (select top 1 eh.empid, eh.dept, eh.date from 
EmpDeptHistory eh where eh.empid = e.id order by eh.date desc) as edh 
3

Вы можете использовать КТР и ранжирование функцию, как ROW_NUMBER:

WITH CTE AS 
(
    SELECT e.id, edh.dept, edh.date, 
      rn = ROW_NUMBER() OVER (PARTITION BY edh.EmpId ORDER BY edh.date DESC) 
    FROM Employee e inner join EmpDeptHistory edh 
     on e.id = edh.empid 
) 
SELECT id, dept, date 
FROM CTE 
WHERE rn = 1 

DEMO

1

Для отдел последние для каждого сотрудника, вы можете сделать это так:

SELECT t1.* 
FROM EmpDeptHistory t1 INNER JOIN 
(
    SELECT EmpId, MAX(Date) [Date] 
    FROM EmpDeptHistory 
    GROUP BY EmpId 
) AS t2 
    ON t1.EmpId = t2.EmpId AND t1.Date = t2.Date 

EmpId может быть введен в ИНЕКЕ, если это необходимо.

Смежные вопросы