SQL TRUNC 后没有重复的时间戳
SQL no duplicate timestamps after TRUNC
我有一个包含一些值的数据库,这些值有时间戳。我所做的是将这些时间戳截断为分钟,因为这些值是以一分钟的频率测量的。
由于一些误差,而测量有时会在一分钟内出现两个值。我想在同一分钟内去掉第二个值,所以每分钟只有一个值。
select trunc(mv.time,'MI') as "minTime",
/*
get all the required measurement-values
*/
from measurementvalue mv
where mv.MEASUREMENTDEVICE_ID = 1 AND mv.time > '16.03.15 00:00:00'
GROUP BY mv.time
ORDER BY mv.time ASC
我得到的是这样的
minTIME | TEMPERATURE | PRESSURE | ...
16.03.15 18:06:00 | 42,1337 | 9000 | ...
16.03.15 18:06:00 | 12,3456 | 1234 | ...
但我只想要第一行。
使用 NOT EXISTS
排除第一(或最后)行(如果存在同一分钟的另一行):
select *
from measurementvalue mv1
where not exists (select 1 from measurementvalue mv2
where mv1.*down_to_minute_part* = mv2.*down_to_minute_part*
and mv2.time > mv1.time)
您必须根据您的 dbms 的方式调整 down_to_minute_part。 (EXTRACT
用于 ANSI SQL。)
您可以使用 row_number()
:
select mv.*
from (select mv.*, trunc(mv.time, 'MI') as minTime
row_number() over (partition by trunc(mv.time, 'MI')
order by mv.time) as seqnum
from measurementvalue mv
where mv.MEASUREMENTDEVICE_ID = 1 AND mv.time > '16.03.15 00:00:00'
) mv
where seqnum = 1
order by mv.time asc;
我有一个包含一些值的数据库,这些值有时间戳。我所做的是将这些时间戳截断为分钟,因为这些值是以一分钟的频率测量的。 由于一些误差,而测量有时会在一分钟内出现两个值。我想在同一分钟内去掉第二个值,所以每分钟只有一个值。
select trunc(mv.time,'MI') as "minTime",
/*
get all the required measurement-values
*/
from measurementvalue mv
where mv.MEASUREMENTDEVICE_ID = 1 AND mv.time > '16.03.15 00:00:00'
GROUP BY mv.time
ORDER BY mv.time ASC
我得到的是这样的
minTIME | TEMPERATURE | PRESSURE | ...
16.03.15 18:06:00 | 42,1337 | 9000 | ...
16.03.15 18:06:00 | 12,3456 | 1234 | ...
但我只想要第一行。
使用 NOT EXISTS
排除第一(或最后)行(如果存在同一分钟的另一行):
select *
from measurementvalue mv1
where not exists (select 1 from measurementvalue mv2
where mv1.*down_to_minute_part* = mv2.*down_to_minute_part*
and mv2.time > mv1.time)
您必须根据您的 dbms 的方式调整 down_to_minute_part。 (EXTRACT
用于 ANSI SQL。)
您可以使用 row_number()
:
select mv.*
from (select mv.*, trunc(mv.time, 'MI') as minTime
row_number() over (partition by trunc(mv.time, 'MI')
order by mv.time) as seqnum
from measurementvalue mv
where mv.MEASUREMENTDEVICE_ID = 1 AND mv.time > '16.03.15 00:00:00'
) mv
where seqnum = 1
order by mv.time asc;