Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql将max id的行更新为sum语句的值_Mysql_Sql - Fatal编程技术网

Mysql将max id的行更新为sum语句的值

Mysql将max id的行更新为sum语句的值,mysql,sql,Mysql,Sql,这可能是一个白日梦,但我正试图让这两个命令分开工作,作为一个单独的命令工作。我想在select语句中转储XXXXX,而不是XXXXX(它给出了昨天总数和今天总数的差值)。组合命令将查找最近的行(max idtanklevel),并使用其自身与前一行的差异对其进行更新 update fw_db.tanklevel2 T3 inner join (select max(idtanklevel) as idtanklevel from fw_db.tanklevel2) T4 on T3.idtank

这可能是一个白日梦,但我正试图让这两个命令分开工作,作为一个单独的命令工作。我想在select语句中转储XXXXX,而不是XXXXX(它给出了昨天总数和今天总数的差值)。组合命令将查找最近的行(max idtanklevel),并使用其自身与前一行的差异对其进行更新

update fw_db.tanklevel2 T3
inner join (select max(idtanklevel) as idtanklevel from fw_db.tanklevel2) T4
on T3.idtanklevel = T4.idtanklevel
set glycolsmallchange = XXXXX;


提前感谢。

以下是我如何在一份声明中完成所有这些工作的。(请注意,此查询假定
idtanklevel
tanklevel2
表中的主键或至少是唯一键;如果不是这样,则需要调整查询。)

记录每个表引用和每个内联视图的目的的一些简短注释:

-- m  = get id of latest row
-- t  = get latest row (the row to be updated)
-- pr = get id for the prior row
--      pri = source for prior row id
--      l = id of latest row (identical to "m")
-- pv = get value from prior row
-- p  = wrapper so we can join to row returned from pv

UPDATE fw_db.tanklevel2 t
  JOIN ( SELECT MAX(idtanklevel) AS idtanklevel FROM fw_db.tanklevel2 ) m
    ON m.idtanklevel = t.idtanklevel
 CROSS
  JOIN ( SELECT pv.glycolsmall
              , pv.idtanklevel
           FROM ( SELECT MAX(pri.idtanklevel) AS idtanklevel
                    FROM fw_db.tanklevel2 pri
                   WHERE pri.idtanklevel <
                         (SELECT MAX(l.idtanklevel) FROM fw_db.tanklevel2 l)
                ) pr
           JOIN fw_db.tanklevel2 pv
             ON pv.idtanklevel = pr.idtanklevel
          LIMIT 1
       ) p
   SET t.glycolsmallchange = ROUND(t.glycolsmall - p.glycolsmall,2)

要测试此语句,在不实际执行更新的情况下,请删除
SET
子句,并将
update
关键字替换为
SELECT
和相关表达式列表,以查看返回的行,例如:

SELECT t.glycolsmallchange                    AS old_glycolsmallchange
     , ROUND(t.glycolsmall - p.glycolsmall,2) AS new_glycolsmallchange
     , t.idtanklevel  AS latest_row_id
     , t.glycolsmall  AS latest_glycolsmall
     , p.idtanklevel  AS prior_row_id
     , p.glycolsmall  AS prior_glycolsmall
  FROM 

问:
idtanklevel
tanklevel2
表上的主键还是唯一键?另外,我不确定
max(idtanklevel)-1是否会获得上一个条目。这将要求
idTankLevel
严格单调,并保证总是被编写—如果事务回滚,这可能不是真的。遗憾的是,这是mySQL,没有像
ROW\u NUMBER()。。。虽然我认为在这种情况下有办法作弊。请给我们看一下起始/结果数据好吗?哦,表中是否有用于排序的日期/时间/时间戳列?如果
idtanklevel
tanklevel2
表上的主键或唯一键,则在第二个查询中不需要
SUM
聚合。。。。也就是说,可以通过查询获得该结果,而无需使用
SUM
聚合。它被设置为自动增量主键。我正在尝试解决办法。
           FROM ( SELECT MAX(pri.idtanklevel) AS idtanklevel
                    FROM fw_db.tanklevel2 pri
                   WHERE pri.idtanklevel <
                         (SELECT MAX(l.idtanklevel) FROM fw_db.tanklevel2 l)
                ) pr
           FROM ( SELECT MAX(l.idtanklevel)-1 AS idtanklevel
                    FROM fw_db.tanklevel2 l
                ) pr
SELECT t.glycolsmallchange                    AS old_glycolsmallchange
     , ROUND(t.glycolsmall - p.glycolsmall,2) AS new_glycolsmallchange
     , t.idtanklevel  AS latest_row_id
     , t.glycolsmall  AS latest_glycolsmall
     , p.idtanklevel  AS prior_row_id
     , p.glycolsmall  AS prior_glycolsmall
  FROM