在开始行的结束日期和结束时间列处添加结束日期和时间值

问题描述 投票:0回答:1

我正在使用从许多loggerid中提取的GPS数据,并且我的表具有latlon重复的连续行,这与设置相反。我只想保留每个连续的纬度和经度副本的第一行,将每个连续的纬度和经度副本的最后一行的datecontimecon分别存储在上述第一行的enddateendtime列中,并删除该连续的经纬度重复项的所有行,包括最后一行。

这是我的桌子的样子:

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 

有人知道解决方案吗?

sql postgresql group-by postgis gaps-and-islands
1个回答
0
投票

这是一个间隙和孤岛的问题,您希望将具有相同纬度和经度的同一记录器的连续行组合在一起。

这是一种利用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

© www.soinside.com 2019 - 2024. All rights reserved.