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