【问题标题】:How I can make a new column with subtraction for two raws with +1 shift如何用 +1 移位为两行减法创建一个新列
【发布时间】:2019-09-12 13:18:03
【问题描述】:

我有两列

sum1   sum2
100    70
60     20
30     10

我还需要一列col3,可以像这样通过减法计算

sum1    sum2    col3
100     70      null
60      20      -80
30      10      -50 

-80 我可以通过20-100-50 通过10-60 获得。我需要用一个移位来减去原始数据

如何通过sql查询得到这个新列?

【问题讨论】:

  • 你的 MySQL 服务器版本是多少?执行SELECT version(); 并编辑问题以添加此查询的结果。此外,您的表中是否有任何id 列,我们从中定义顺序。请注意,数据是无序的,如果不按特定列/表达式定义顺序,“前一个”/“移位”术语是没有意义的。
  • 这个视图已经是聚合查询的结果,并按季度分组。第三列将是上一季度的流失结果(如果您需要此上下文)

标签: mysql sql subtraction shift


【解决方案1】:

在关系型数据库中,记录默认是无序的,所以没有previsous记录的固有概念。对于您要求的可能,您确实需要原始表中的一列可用于排序记录。我假设这样的列存在于表中,称为id

如果你运行的是 MySQL 8.0,这很简单,使用窗口函数LAG(),它可以让你访问之前的记录:

SELECT sum1, sum2, sum2 - LAG(sum1) OVER(ORDER BY id) col3
FROM mytable

如果您运行的是旧版本的 MySQL,那么它会稍微复杂一些。一个常见的解决方案是自连接表,并使用NOT EXISTS 条件来定位先前的记录(这句话为:recover the record has a little id than the current record,并且没有其他记录存在id 小于当前记录且大于连接记录):

SELECT t.sum1, t.sum2, t.sum2 - t_last.sum1 col3
FROM mytable t
LEFT JOIN mytable t_last
    ON t_last.id < t.id
    AND NOT EXISTS (
        SELECT 1 
        FROM mytable t1
        WHERE t1.id < t.id AND t1.id > t_last.id
    )

【讨论】:

    【解决方案2】:

    创建一个接受 2 个 int 参数的过程。在里面写减法语句。现在,由于我们不能在 select 语句中调用此过程,我们将创建一个包装类函数,该函数将调用该过程,然后通过 select 语句调用此函数并插入到第三列。我们不能直接调用函数/过程,因为我们不能在调用函数时在 select 语句中执行 DML 操作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-12
      • 2023-01-19
      • 2014-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      相关资源
      最近更新 更多