【问题标题】:Mysql: update current value if previous row are same with current rowMysql:如果前一行与当前行相同,则更新当前值
【发布时间】:2016-01-17 11:10:48
【问题描述】:

如果我的上一行与当前行相同,我如何更新当前行值。

示例:

当前行是 68,前一行也是 68.. 我想将当前行更新为 68-20,即 48。

98-20 = 78 相同。

这样校正后的数据将如下所示:

我有超过 1000 条这样的记录,无法手动一条一条地更新记录。

update table1 set DIH_QTY_BALANCE=DIH_QTY_BALANCE-DIH_REORDER_QTY

WHERE 如何将上一行与当前行放在 where 子句上?

这是架构 + 数据: http://pastebin.com/T1tYDT6Y

对于 sqlfiddle 来说太大了。

任何帮助都会很棒。

【问题讨论】:

  • 如何定义以前的记录?关系数据库没有这个概念,因为每个查询可能对记录进行不同的排序。
  • 我按日期排序,哪个较旧的将是前一行,或者 DIHISTORYID 较旧的将是前一行...
  • 为输入数据创建一个sqlfiddle
  • 模式和数据添加到问题

标签: mysql sql


【解决方案1】:

据我所知,MySQL 在更新语句中从同一个表中进行选择存在问题。这就是您必须要做的,因为要更新记录与否,您必须从同一个表中选择其先前的记录。

所以创建一个临时表,给它行号,然后通过自连接从中选择,将每条记录与之前的记录进行比较。

create temporary table temp
(
  rownum int, 
  dihistoryid int, 
  dih_qty_balance int
) engine = memory;

set @num = 0;

insert into temp
  select 
    @num := @num + 1 as rownum, 
    dihistoryid, 
    dih_qty_balance 
  from mytable
  order by dihistoryid;

update mytable
set dih_qty_balance = dih_qty_balance - dih_reorder_qty
where dihistoryid in
(
  select current.dihistoryid
  from temp current
  join temp previous on previous.rownum = current.rownum - 1
  where previous.dih_qty_balance = current.dih_qty_balance
);

drop temporary table temp;

【讨论】:

    【解决方案2】:

    可能是这样的

    SELECT DIH_QTY_BALANCE,
           (SELECT DIH_QTY_BALANCE FROM example e2
            WHERE e2.DIHISTORYID < e1.DIHISTORYID
            ORDER BY DIHISTORYID DESC LIMIT 1) as previous_value,
           (SELECT value FROM example e3
            WHERE e3.DIHISTORYID > e1.DIHISTORYID 
            ORDER BY DIHISTORYID ASC LIMIT 1) as next_value
    FROM example e1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多