SQL Запрос на присоединение к серверу - требуется помощь - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть таблица employee_travel, в которой мне нужно указать место и дату отъезда каждого сотрудника и выяснить дату прибытия, когда сотрудник возвращается в исходное место. Я знаю, что данные плохие / недостаточные. Мне все еще нужно получить данные в формате ниже. Пожалуйста помоги.

enter image description here

Я хочу, чтобы вывод был таким:

enter image description here

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

Если сотрудники всегда работают в одном и том же городе - как в вашем примере - вы можете перечислить поездки по количеству раз, когда был найден исходный город. Тогда остальное - агрегация:

select distinct employee,
       first_value(ticket) over (partition by employee, trip_number order by departure) as ticket,
       from,
       min(departure) over (partition by employee, trip_number) as departure, 
       max(departure) over (partition by employee, trip_number) as arrival
from (select et.*,
             sum(case when from = first_from then 1 else 0 end) over (partition by employee order by departure) as trip_number
      from (select et.*,
                   first_value(from) over (partition by employee order by departure) as first_from
            from employee_travel et
           ) et
     ) et;

Проблема становится существенно другой, если поездки могут начинаться из разных мест для одного и того же сотрудника. Если это действительно так, я бы порекомендовал задать новый вопрос. Предоставьте образцы данных и желаемые результаты в виде текст таблиц в вопросе - и также полезна дБ / SQL скрипка.

0 голосов
/ 25 апреля 2020

Вы можете рассчитать его за два шага, во-первых, мы добавляем дату прибытия и ticket_id к каждому отправлению.

И, во-вторых, мы только возвращаем отправления новых циклов, проверяя, что их ticket_id больше, чем каждый предыдущий прибытие ticket_id.

with DeparturesAndArrivals as (
  select Departure.Ticket_ID, Departure.Employee, Departure.[From], Departure.Departure, 
         Arrival.Departure as Arrival, Arrival.Ticket_ID as Arrival_Ticket_ID
  from employee_travel as Departure
       outer apply (select top 1 Ticket_ID, Departure
                    from employee_travel as Arrival
                    where Arrival.Employee = Departure.Employee and
                          Arrival.[To] = Departure.[From] and
                          Arrival.Ticket_ID > Departure.Ticket_ID
                    order by Arrival.Ticket_ID) as Arrival
)
select Ticket_ID, Employee, [From], Departure, Arrival
from DeparturesAndArrivals as Departures
where Ticket_ID > (select coalesce(max(PreviousArrivals.Arrival_Ticket_ID), -1)
                   from DeparturesAndArrivals as PreviousArrivals
                   where PreviousArrivals.Employee = Departures.Employee and
                         PreviousArrivals.Ticket_ID < Departures.Ticket_ID) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...