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 函数过滤掉 speed
为 0
并且其“下一个”行也有 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
子句。
我有一个问题更像是找到解决问题的方法。
所以问题:
我的 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 函数过滤掉 speed
为 0
并且其“下一个”行也有 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
子句。