2014-09-16 2 views
-1
Employees 
    EmpID : int(10) 
    Firstname: varchar(100) 
    Lastname: varchar(100) 
    HireDate: timestamp 
    TerminationDate: timestamp 

    AnnualReviews 
    EmpID: int(10) 
    ReviewDate: timestamp 

Что такое запрос, возвращающий каждого сотрудника, и для каждой строки/сотрудника включает наибольшее количество сотрудников, которые работали в компании в любое время в течение срока их пребывания в должности и на первое свидание этот максимум был достигнут. До сих пор это мой запрос:Advanced MySQL Query выбирает и сравнивает время в одном поле

select *, (select count(empid) from employees where terminationdate between t.hiredate and t.terminationdate) 
from employees as t 
group by empid 
+0

вам просто помогли здесь: http://stackoverflow.com/questions/25866256/advanced-mysql-query, после чего вы исчезли, не приняв никакого ответа. теперь вы спрашиваете, что, вероятно, вопрос № 2 вашей домашней работы. прочитайте FAQ на этом сайте и начните показывать хорошие манеры. – Vland

+0

ОК Я решил это самостоятельно – Khaneddy2013

+0

Мне все равно. вы по-прежнему должны вознаграждать людей, которые помогают вам бесплатно и принимать полезные/рабочие ответы. это то, что StackOverflow о – Vland

ответ

1

То, что вы близко.

Но есть еще много работы.

Мы хотели, чтобы выработать условия, которые определяют, сколько сотрудников было «работать» в любой момент времени условие я бы проверить (т.е. при заданном значении временной метки.):

HireDate <= timestamp < TerminationDate 

Мы 'd необходимо расширить это сравнение, так что значение NULL для TerminationDate будет обрабатываться, как если бы это был момент времени после значение метки времени. Это достаточно легко сделать)

HireDate <= timestamp AND (timestamp < TerminationDate OR TerminationDate IS NULL 

Так, что-то вроде этого:.

SELECT COUNT(1) 
    FROM Employees e 
    WHERE (:timestamp >= e.HireDate) 
    AND (:timestamp < e.TerminationDate OR e.TerminationDate IS NULL) 

что «подсчет» значение останется тем же, и изменится только для «прокат» или «прекратить» мероприятие.

Если у нас есть отличный список всех временных меток для всех случаев «найма» и «прекращения», мы можем получить количество сотрудников в этот момент времени.

Таким образом, этот запрос будет давать нам работник рассчитывать каждый раз, когда граф работника может измениться:

SELECT t.ts  AS `as_of` 
     , COUNT(1) AS `employee_count` 
    FROM Employees e 
    JOIN (SELECT t.TerminationDate AS ts 
      FROM Employees t 
      WHERE t.TerminationDate IS NOT NULL 
      GROUP BY t.TerminationDate 
      UNION 
      SELECT h.HireDate AS ts 
      FROM Employees h 
      WHERE h.HireDate IS NOT NULL 
      GROUP BY h.HireDate 
     ) t 
    ON (t.ts >= e.HireDate) 
    AND (t.ts < e.TerminationDate OR e.TerminationDate IS NULL) 
    GROUP BY t.ts 

Мы могли бы использовать этот результат (как вложенное представление) и присоединиться, что конкретный сотрудник, и получить только строки, которые имеют временную метку as_of, которая соответствует периоду занятости для этого сотрудника. Затем просто вытащить максимум employee_count. Нетрудно было бы идентифицировать более ранние из нескольких дат as_of, если этот максимум employee_count произошел несколько раз.

(Формулировка вопроса оставляет открытым вопрос, на «раннюю дату» когда-либо что работник COUNT достигли или превысили максимум того, что произошло во время сотрудников пребывания, или только самую раннюю дату в пределах сотрудников пребывания, что максимальный был достигнут. Можно получить либо результат.)

Это только один из способов подойти к проблеме.

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