Порядок списка строк по самому старому времени - PullRequest
0 голосов
/ 31 мая 2019

Я немного новичок в SQL, и у меня есть эта проблема, чтобы получить конкретную информацию из трех таблиц. У меня есть эти три таблицы.

таблица сотрудников

enter image description here

фирменный стол

enter image description here

таблица занятости

enter image description here

EmployeeID в Занятости - FK CompanyID в компании является FK EmploymentID в Emplyment является PK NULL в EmploymentEndDate in Employment означает, что работник в настоящее время работает там.

Я пытался это, но не работает

select Company.CompanyName as CompanyName , CONCAT( Employee.FirstName, ' ' ,Employee.LastName) as EmployeeName , Employment.EmploymentStartDate from Employment LEFT JOIN Employee on Employee.EmployeeID = Employment.EmployeeID 
LEFT JOIN Company on Company.CompanyID = Employment.CompanyID 
where Employment.EmploymentEndDate is null 
and EXISTS(SELECT Employment.CompanyID, MAX(DATEDIFF( DAY,Employment.EmploymentStartDate ,GETDATE())) as MaxDate FROM  Employment where  Employment.EmploymentEndDate is null group by CompanyID)

и дает мне такой результат:

enter image description here

, что неправильно, потому что от компании "Steve's Widgets Inc" я ожидаю только Джона Доу, который является самым старым работником.

Это именно то, что я хочу, перечислить все компании и указать имя и дату начала сотрудника, который работал в компании, самого длинного из всех сотрудников, которые там сейчас работают. (Ожидаемые столбцы: CompanyName, EmployeeName, EmploymentStartDate)

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

Если вы хотите использовать первое значение, оно будет выглядеть примерно так: обратите внимание, что я не использовал первое значение на сервере sql (только на db2), и я не проверял это, поскольку у меня нет сервера sql под рукой.

SELECT DISTINCT
  Company.CompanyName, 
  CONCAT(Employee.FirstName, ' ', Employee.LastName) AS EmployeeName,
  FIRST_VALUE(Employment.EmploymentStartDate) 
    OVER (PARTITION BY Company.CompanyName, CONCAT(Employee.FirstName, ' ', Employee.LastName) 
      ORDER BY Employment.EmploymentStartDate ASC 
      RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
    ) AS StartDate
FROM Employment 
JOIN Company ON Employment.CompanyID = Company.CompanyID
JOIN Employee ON Employment.EmployeeID = Employee.EmployeeID
WHERE Employment.EmploymentEndDate IS NULL
0 голосов
/ 31 мая 2019
with oldest (companyId, empStart) as 
(
select companyId, min(EmploymentStartDate) 
from Employment
where EmploymentEndDate is null
group by companyId
)
select c.CompanyName, e.Firstname + ' ' + e.LastName as employeeName, em.employmentStartDate
from Employment em
inner join oldest o on em.CompanyId = o.CompanyID and em.employmentStartDate = o.empStart
inner join employee e on em.EmployeeId = e.EmployeeId
inner join company c on em.CompanyId = c.CompanyId;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...