Mysql 按日期时间选择上一个数据条目
我有一个mysql数据库,其中有一个包含性能数据的表。每个数据表条目都是针对特定计数器的Mysql 按日期时间选择上一个数据条目,mysql,Mysql,我有一个mysql数据库,其中有一个包含性能数据的表。每个数据表条目都是针对特定计数器的 DATA ---- dat_date BIGINT value BIGINT dat_date DATETIME(3) FK_dt_id BIGINT 对于每个条目,我需要计算速度和加速度。因此,我想创建一个SELECT,它将选择一行,其中包含上一行。 FK_dt_id是计数器类型上的外键 我试过这个: SELECT d1.dat_date,
DATA
----
dat_date BIGINT
value BIGINT
dat_date DATETIME(3)
FK_dt_id BIGINT
对于每个条目,我需要计算速度和加速度。因此,我想创建一个SELECT,它将选择一行,其中包含上一行。
FK_dt_id是计数器类型上的外键
我试过这个:
SELECT d1.dat_date,
d1.value v1,
d1.PK_dat_id
FROM data d1
INNER JOIN (SELECT * FROM data d2 ORDER BY d2.dat_date) d2
ON (d2.dat_date < d1.dat_date
AND d2.FK_dt_id = d1.FK_dt_id)
它可以工作,但我不能得到上一个主键,只有它的值。
有什么想法吗?使用纯MySQL语法进行类似操作的最快、也不一定是最简单的方法是使用用户变量的小技巧:
select @pk_data_id as prev_pk_data_id
, @pk_data_id := (case
when @fk_counter_id = fk_counter_id then a.pk_data_id
else 0
end) as pk_data_id
, @fk_counter_id := a.fk_counter_id as fk_counter_id
from
(select @pk_data_id := 0, @fk_counter_id := 0) as init
, data as a
order by a.fk_counter_id, a.pk_data_id
拥有此行集后,可以将其与数据表联接
我把这个结果放在一个临时表中,以后再使用它;大概是这样的:
drop table if exists temp_tbl;
create temporary table temp_tbl
select @pk_data_id as prev_pk_data_id
, @pk_data_id := (case
when @fk_counter_id = fk_counter_id then a.pk_data_id
else 0
end) as pk_data_id
, @fk_counter_id := a.fk_counter_id as fk_counter_id
from
(select @pk_data_id := 0, @fk_counter_id := 0) as init
, data as a
order by a.fk_counter_id, a.pk_data_id;
alter table temp_tbl
add index dId (pk_data_id),
add index pdId (prev_pk_data_id),
add index cId (fk_counter_id);
-- Now use the temp table to get what you need
select d1.*
, d2.pk_data_id as prev_pk_data_id
, d2.data_value as prev_data_value
, d2.data_datetime as prev_data_datetime
from data as d1
-- If you don't use the temp table, substitute 'temp_tbl' with
-- the query from above
inner join temp_tbl as a
on d1.pk_data_id = a.pk_data_id
and d1.fk_counter_id = a.fk_counter_id
left join data as d2
on a.prev_pk_data_id = d2.pk_data_id
and a.fk_counter_id = d2.fk_counter_id
在数据架构中,我看不到查询中的任何字段。你能用一个正确的模式或查询来更新你的帖子吗?这种需求很难用直接的SQL或者存储过程来解决,但是如果你有任何一种脚本引擎的话,这都很容易做到。。。在报告系统中,或在命令行中,或在程序中。您只需按唯一标识度量值的任何字段排序,以便将同一度量值的所有事件分组在一起,然后按度量值时间排序。在循环时,将前面的一条记录隐藏起来,这样就可以向后窥视一条记录。当ID字段更改时,它是一个新组的开始,并且没有前面的记录。