【问题标题】:Adding end date and time values at start row's end date and end time columns在开始行的结束日期和结束时间列添加结束日期和时间值
【发布时间】:2020-03-22 11:16:06
【问题描述】:

我正在处理从许多 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】:

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

    这是一种使用row_number()s 之间的差异来识别组的方法:

    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

    【讨论】:

    • 感谢您的建议!我在上面的问题中没有提到这一点,但id 不是连续的;即 401 可能出现在 400 之前。除了min(id) 之外,还有其他选择第一个ids 的方法吗?我尝试了first_value(),但失败了,因为窗口函数内的列也需要在 group by 子句中或在聚合函数中使用。
    • 我试过代码。它不会对纬度和经度重复的连续记录进行分组。
    【解决方案2】:

    This answer 给出了我想要实现的目标。我添加了一个新的顺序 ID 列作为min(id)first_value(id) 问题的解决方法。就我而言,它将是:

    select  
        min(seq_id) as first_seq_id, 
        max(seq_id) as last_seq_id, 
        loggerid, 
        lat, 
        lon, 
        min(datetimecon) as first_datetimecon, 
        max(datetimecon) as last_datetimecon 
    from (
        select 
             mytable.*, 
             row_number() over (partition by loggerid, lat, lon order by datetimecon) as seqnum_na,
             row_number() over (partition by loggerid order by datetimecon) as seqnum_n
        from mytable) t
    group by (seqnum_n - seqnum_na), loggerid, lat, lon 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 2022-11-16
      • 1970-01-01
      • 2012-08-19
      相关资源
      最近更新 更多