Sql 从旅行信息中获取当前国家/地区

Sql 从旅行信息中获取当前国家/地区,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我有一个简单的表(TRIP),它存储如下所示的TRIP信息 trip_id traveler country_from country_to departure_date arrival_date 1 Test1 Germany Italy 2016-01-01 2016-01-02 1 Test1 Italy France 2016-04-01 2016

我有一个简单的表(TRIP),它存储如下所示的TRIP信息

trip_id traveler    country_from    country_to  departure_date  arrival_date
1        Test1       Germany         Italy       2016-01-01     2016-01-02
1        Test1       Italy           France      2016-04-01     2016-04-02
1        Test1       France          Italy       2016-08-28     2016-08-28
1        Test1       Italy           Germany     2016-08-30     2016-10-31 
2        Test2       France          USA         2016-01-28     2016-02-28 
2        Test2       USA             France      2016-08-30     2016-10-31 
实际上这意味着

Test1 travels: Germany -> Italy -> France -> Italy -> Germany 
Test2 travels: from France -> USA -> France
出发日期
到达日期
定义旅行者何时从出发
国家/地区,以及何时到达
。。。实际上,这是飞行中花费的时间

(我同意,这张表很糟糕,有很多正常化问题,但我无法管理,我们拥有我们拥有的)

我需要写一个查询,它将返回旅行者的姓名,以及在给定的时间段内旅行者所在的国家(或者如果许多国家是第一个国家)

例如,对于时间段2016-03-01-2016-04-02,查询应返回

Test1 Italy
Test2 USA

请建议获得该结果的最佳方法,我尝试将表本身加入到表中,几乎没有变化,但总是遇到未涵盖的情况

您需要将每个国家的行程开始和结束放在一行中。在SQL Server 2012+中,您可以为此使用
lead()
。查询的其余部分只是处理重叠的时间段:

select t.*
from (select t.country_to as country, t.arrival_date,
             lead(t.departure_date) over (partition by t.traveler order by arrival_date) as departure_date
      from trips t
      where t.traveler = @traveler
     ) t
where @date1 <= t.departure_date and
      @date2 >= t.arrival_date;

您需要将每个国家的旅行开始和结束放在一行中。在SQL Server 2012+中,您可以为此使用
lead()
。查询的其余部分只是处理重叠的时间段:

select t.*
from (select t.country_to as country, t.arrival_date,
             lead(t.departure_date) over (partition by t.traveler order by arrival_date) as departure_date
      from trips t
      where t.traveler = @traveler
     ) t
where @date1 <= t.departure_date and
      @date2 >= t.arrival_date;

无论如何,这给了一个伟大的想法如何完成它,谢谢。。。正如你在另一个答案中所建议的那样,我使用稠密秩和内部连接-1:)无论如何,这给出了一个实现它的好主意,谢谢。。。我使用稠密的_秩和与-1的内部联接,正如您在另一个答案中所建议的:)