【问题标题】:SQL - Compute difference between two rows and put in another columnSQL - 计算两行之间的差异并放入另一列
【发布时间】:2013-03-11 11:46:31
【问题描述】:

我有一个 MySQL 表,其中包含一个日期、一个来源、一个数字,例如facebook 粉丝和第三列,其中应包含对前一天的更改。

表格如下所示:

Date        |  Source  | fans | new fans
2013-02-02  | Facebook | 100  | -
2013-02-02  | Twitter  | 60   | -
2013-02-03  | Facebook | 120  | -
2013-02-03  | Twitter  | 62   | -
2013-02-04  | Twitter  | 65   | -
2013-02-04  | Facebook | 130  | -
2013-02-05  | Facebook | 145  | -
2013-02-05  | Twitter  | 70   | -

sql 查询应该把它变成这样:

Date        |  Source  | fans | new fans
2013-02-02  | Facebook | 100  | - 
2013-02-02  | Twitter  | 60   | - 
2013-02-03  | Facebook | 120  | 20
2013-02-03  | Twitter  | 62   | 2 
2013-02-04  | Twitter  | 65   | 3 
2013-02-04  | Facebook | 130  | 10
2013-02-05  | Facebook | 145  | 15
2013-02-05  | Twitter  | 70   | 5

我如何计算一个来源的两天之差?

【问题讨论】:

  • 如果您正确标记它(而不是在描述中说它是 mysql),正确的人会调查您的问题。就像@bluefeet 所做的那样。
  • 你能保证每个来源每一天天(第一天之后)都有记录吗?您是真的想更新表格,还是只想将结果显示为查询的输出?

标签: mysql sql


【解决方案1】:

您可以使用UPDATE JOIN 来完成此操作; ab 是计算两者之间差异的两行,c 被 LEFT 加入以确保 ab 之间没有行。

UPDATE TableA AS a
JOIN TableA b 
  ON a.`Source` = b.`Source` AND a.`Date` > b.`Date`
LEFT JOIN TableA c
  ON a.`Source` = c.`Source` AND a.`Date` > c.`Date` AND c.`Date` > b.`Date`
SET a.`new fans` = a.`fans` - b.`fans`
WHERE c.`Date` IS NULL

An SQLfiddle for testing

请注意,这将更新您的表中的数据,并且在从 Internet 上随机的人那里运行 SQL 更新之前,您应该始终备份 :)

【讨论】:

  • 完美运行,即使中间缺少一天。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
  • 2018-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多