我正在使用从许多loggerid
中提取的GPS数据,并且我的表具有lat
和lon
重复的连续行,这与设置相反。我只想保留每个连续的纬度和经度副本的第一行,将每个连续的纬度和经度副本的最后一行的datecon
和timecon
分别存储在上述第一行的enddate
和endtime
列中,并删除该连续的经纬度重复项的所有行,包括最后一行。
这是我的桌子的样子:
id, loggerid, datecon, timecon, lat, lon
200, 1, 2018-07-18, 07:04:10, 16.694834, 100.319834
201, 1, 2018-07-18, 07:36:30, 16.694834, 100.319834
202, 1, 2018-07-18, 08:11:00, 16.694834, 100.319834
203, 1, 2018-07-18, 08:49:25, 16.851309, 100.315957
204, 1, 2018-07-18, 09:20:58, 16.851309, 100.315957
300, 2, 2018-08-20, 13:52:22, 16.947631, 100.321598
301, 2, 2018-08-20, 14:27:34, 16.947631, 100.321598
302, 2, 2018-08-20, 14:59:11, 16.392313, 100.395439
我正在尝试实现的输出:
id, loggerid, datecon, timecon, enddate, endtime, lat, lon
200, 1, 2018-07-18, 07:04:10, 2018-07-18, 08:11:00, 16.694834, 100.319834
203, 1, 2018-07-18, 08:49:25, 2018-07-18, 09:20:58, 16.851309, 100.315957
300, 2, 2018-08-20, 13:52:22, 2018-08-20, 14:27:34, 16.947631, 100.321598
302, 2, 2018-08-20, 14:59:11, [null], [null], 16.392313, 100.395439
有人知道解决方案吗?
这是一个间隙和孤岛的问题,您希望将具有相同纬度和经度的同一记录器的连续行组合在一起。
这是一种利用row_number()
之间的差异来识别组的方法:
select
min(id) id,
loggerid,
min(datecon + timecon) first_datetimecon,
max(datecon + timecon) last_datetimecon,
lat,
lon
from (
select
t.*,
row_number() over(partition by loggerid order by datecon + timecon) rn1,
row_number() over(partition by loggerid, lat, lon order by datecon + timecon) rn2
from mytable t
) t
group by loggerid, lat, lon
请注意,将日期和时间部分存储在单独的列中不是一个好习惯,因为当您实际需要比较日期时间值时,这会使事情变得更加复杂。上面的查询为您提供每个系列的开始和结束datetime。