Oracle中如何汇总行?

How to sumarize rows in Oracle?

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

所以问题:

我的 table 每隔 2 分钟就会收到一条包含各种信息的新线路。他们是:

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

其中几个位置的速度为零,在我的情况下,表明车辆已停止。 如果车辆有多个停止位置(速度 = 0),我只需要引入 select 两个移动位置之间停止的最后一个位置。

图片说明:

在图像中,速度为 0 的地方有两行 selected。我需要以某种方式只显示该时间段的最后一行,对于第 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使用:

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; 

您可以使用 window 函数过滤掉 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)

您可以轻松修改查询以过滤给定日期范围 and/or 车辆,方法是向子查询添加 where 子句。