【问题标题】:How to sumarize rows in Oracle?如何在 Oracle 中汇总行?
【发布时间】:2020-08-05 17:25:22
【问题描述】:

我有一个问题更像是寻找解决问题的方法。

那么问题来了:

每 2 分钟,我就会在我的餐桌上收到一条新行,其中包含各种信息。他们是:

ID_VEIC - Vehicle ID
DT_POSI - Position date
LAT - latitude
LONGI - longitude
SPEED - car speed when positioning
GMT - Vehicle gmt.

其中几个位置的速度为零,就我而言,这表明车辆已停止。 如果车辆有多个停止位置(速度 = 0),我必须只选择两个移动位置之间的最后一个停止位置。

用图片解释:

在图像中,选择了速度为 0 的两条线。在第 11 行的情况下,我需要以某种方式仅显示该期间的最后一行,并且仍然将速度大于 0 的所有其他线带入。

这里更详细:

当前结果集:

ROWNUM  ID_VEIC    DAT_POSI              LAT            LONGI   SPEED        
1   1211678   06/08/2020 06:08  -254.454.135       -544.047.225   15    
2   1211678   06/08/2020 06:38  -25.445.364        -544.047.383   20    
3   1211678   06/08/2020 07:08  -25.445.401        -54.404.762     0    
4   1211678   06/08/2020 07:38  -254.454.135       -544.046.878    0    
5   1211678   06/08/2020 08:08  -254.454.255       -544.046.828   10    
6   1211678   06/08/2020 08:38  -254.453.996       -54.404.707    25    
7   1211678   06/08/2020 09:08  -25.445.428        -544.047.445   45    
8   1211678   06/08/2020 09:38  -254.454.583       -544.048.415    0    

想要的结果集

 ROWNUM ID_VEIC    DAT_POSI              LAT            LONGI   SPEED        
    1   1211678   06/08/2020 06:08  -254.454.135       -544.047.225   15    
    2   1211678   06/08/2020 06:38  -25.445.364        -544.047.383   20    
    3   1211678   06/08/2020 07:38  -254.454.135       -544.046.878    0    
    4   1211678   06/08/2020 08:08  -254.454.255       -544.046.828   10    
    5   1211678   06/08/2020 08:38  -254.453.996       -54.404.707    25    
    6   1211678   06/08/2020 09:08  -25.445.428        -544.047.445   45    
    7   1211678   06/08/2020 09:38  -254.454.583       -544.048.415    0    

第 3 行已被删除,只显示之前的第 4 行。

知道怎么做吗?

在使用的选择下方:

SELECT  ID_VEIC,
        DAT_POSI,
        LAT,
        LONGI, 
        SPEED,
        GMT
  FROM LITERAL_VIEW   
 WHERE  ID_VEIC= 1211678
   AND DAT_POSI BETWEEN SYSDATE - INTERVAL '2' HOUR AND SYSDATE
   AND ROWNUM <= 999
 ORDER BY ID_VEIC, 
          DAT_POSI; 

【问题讨论】:

  • 请编辑您的问题以将您的原始数据和预期结果显示为格式化文本(而非图像)。听起来像一个差距和岛屿问题,但不确定。为什么在速度为零时纬度/经度会发生变化,这有关系吗?此外,通过rownum before 排序过滤会返回一组不确定的行。
  • 同意。当您在查询中打开 order by 时,请非常小心地使用 rownum
  • 尽管速度为零,但纬度/经度正在变化,因为我每 2 分钟收到一次车辆定位。在那段时间里,汽车可能移动了一点,然后又停下来,在那个间隔内,将零速设置在不同的位置。感谢提供 rownum 信息以及格式。

标签: sql oracle window-functions gaps-and-islands


【解决方案1】:

您可以使用窗口函数过滤掉 speed0 且“下”行也包含 0 speed 的行:

select id_veic, dat_posi, lat, longi, speed, gmt
from (
    select l.*, lead(speed) over(partition by id_veic order by date_posi) lead_speed
    from literal_view l
) t
where not (speed = 0 and lead_speed = 0)

您可以通过在子查询中添加where 子句轻松修改查询以过滤给定的日期范围和/或车辆。

【讨论】:

  • 当没有更多的下一行时,为lead_speed 添加大于 0 的默认值,就像lead(speed,1,1) 这样,如果最后一行的速度为 0,过滤器仍然可以为它们工作。
  • 感谢您的回答,它正在工作!只是一个小细节,如果所有位置的速度都为零,那么当我运行此查询时,我不会看到任何位置。有什么方法可以显示最后的位置吗?我输入了“领先(速度,1,1)”,但仍然没有出现。
  • 如果所有位置的速度都为 0,lead(speed,1,1) over(partition by id_veic order by dat_posi) lead_speed 为我工作,只显示最后一行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-21
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多