MySql使用存储过程拼接sql,查询当前数据与下一条数据时间差,union all合并查询结果集

CREATE PROCEDURE `th_line_step_beat_state`(in table_name VARCHAR(255),in line_id INT,in SOUTIME datetime,in DESTIME datetime)
BEGIN
    -- 参数(表名,id,开始时间,结束时间)
    -- 查询当前数据与下一条数据的时间差  
    SET @sqlcmd = concat('select if(e.`CODE` = e.code1,(select @rownum := @rownum + 1),(select @rownum := 1))  rownum,
     e.`CODE`,e.`NAME`,e.tm_station_id,e.line_id,e.SOUTIME1,e.DESTIME1,
     e.diff_seconds,e.qty,e.beat,e.qty_tag,e.va1,e.v1,e.remarks
     from 
         (select b.`CODE`,lag(b.`CODE`,1) over (PARTITION by b.`CODE` order by d.SOUTIME1) code1,
         b.`NAME`,b.tm_station_id,b.line_id,d.SOUTIME1,d.DESTIME1,
         UNIX_TIMESTAMP(d.DESTIME1) - UNIX_TIMESTAMP(d.SOUTIME1) diff_seconds,b.qty,
         case 
             when d.va1=d.v1 and d.va1 = 1 then (UNIX_TIMESTAMP(d.DESTIME1) - UNIX_TIMESTAMP(d.SOUTIME1)) / b.qty 
            end beat,
         b.qty_tag,d.va1,d.v1,
         case 
             when d.va1=d.v1 and d.va1 = 1  then ''节拍'' 
             when d.va1 = 1 and d.v1 = 0 then ''工作时间'' 
             when d.va1 = 0 and d.v1 = 1 then ''等待时间'' end remarks
         from 
         (
            select a._NAME,a.SOUTIME1,a.DESTIME1,a.va1,a.v1 
            from (
                 select info._NAME,info._TIMESTAMP SOUTIME1,
                 lead(info._TIMESTAMP,1) over (PARTITION by info._NAME order by info._TIMESTAMP) DESTIME1,
                 info._VALUE va1,
                 lead(info._VALUE,1) over (PARTITION by info._NAME order by info._TIMESTAMP) v1
                 from ',table_name,' info 
                 where info._NAME not like ''%CROSS%'' and 
                 info.`_TIMESTAMP` >= ','''',SOUTIME,'''','
                 and info.`_TIMESTAMP` <= ','''',DESTIME,'''',' 
            ) a where a.DESTIME1 is not null 
             union all
             (select a._NAME,a.SOUTIME1,a.DESTIME1,a.va1,a.v1 
             from (
                    select info._NAME,info._TIMESTAMP SOUTIME1,
                    lead(info._TIMESTAMP,1) over (PARTITION by info._NAME order by info._TIMESTAMP) DESTIME1,
                    info._VALUE va1,
                    lead(info._VALUE,1) over (PARTITION by info._NAME order by info._TIMESTAMP) v1
                    from ',table_name,' info 
                    where info._NAME not like ''%CROSS%'' and 
                    info.`_TIMESTAMP` >= ','''',SOUTIME,'''','
                 and info.`_TIMESTAMP` <= ','''',DESTIME,'''','
                    and info._VALUE = 1 
             ) a where a.DESTIME1 is not null)
         ) d left join tm_station_step b on b.`CODE` = d._name  
         where b.LINE_ID = ','''',LINE_ID,'''',' 
         group by d.SOUTIME1 
         order by b.`CODE`,d.SOUTIME1) e ');
    -- select @sqlcmd;
    PREPARE stmt FROM @sqlcmd;

    EXECUTE stmt;

    DEALLOCATE PREPARE stmt;

end

 

posted @ 2022-09-07 16:33  RainHouse  阅读(388)  评论(0编辑  收藏  举报