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,

我有一个mysql数据库,其中有一个包含性能数据的表。每个数据表条目都是针对特定计数器的

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字段更改时,它是一个新组的开始,并且没有前面的记录。