Sql 从旅行信息中获取当前国家/地区
我有一个简单的表(TRIP),它存储如下所示的TRIP信息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_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的内部联接,正如您在另一个答案中所建议的:)