【问题标题】:SQL Server join query - assistance neededSQL Server 连接查询 - 需要帮助
【发布时间】:2023-03-20 11:40:01
【问题描述】:

我有一张表employee_travel,我需要在其中确定每位员工的出发地点和日期,并找出员工返回初始地点时的到达日期。我知道数据很差/不足。我仍然需要以以下格式获取数据。请帮忙。

我希望输出是这样的:

【问题讨论】:

  • 那么,您的问题是什么,您尝试了哪些方法,为什么没有奏效,或者您进行的研究是什么,您不理解的又是什么?
  • 员工总是从同一个城市出发吗?
  • @Gordon:没有员工不是从同一个城市开始的
  • @curiousboy 。 . .正如我在回答中建议的那样,如果是这种情况,我认为您应该问一个 new 问题,以及示例数据和期望的结果——但不是作为图像。图片没有帮助。
  • 对不起,我的错。我误读了你的问题。是的,每个员工每次都会从他自己的城市开始。我会试试你的建议。

标签: sql sql-server join


【解决方案1】:

您可以分两步计算,首先我们将 Arrival date 和 ticket_id 添加到每个 Departure 中。

第二,我们只返回新周期的出发,检查他们的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) 

【讨论】:

    【解决方案2】:

    如果员工总是从同一个城市出发(如您的示例所示),您可以按找到原始城市的次数来列举行程。然后剩下的就是聚合:

    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;
    

    如果同一员工的旅行可以从不同地点开始,问题就会大不相同。如果确实如此,我建议您提出 new 问题。在问题中以 text 表的形式提供示例数据和所需结果——db/SQL fiddle 也很有帮助。

    【讨论】: