【问题标题】:How to get sum of differences of records through mysql query如何通过mysql查询获得记录差异的总和
【发布时间】:2013-04-19 08:07:30
【问题描述】:

我有一张如下表

Value          Count
value1         55
value2         60
value3         65
value4         20
value5         25
value6         45
value7          5
value8         25

我需要一个查询来获取两个连续计数之间的差并将它们相加。一个条件是,如果下一个值小于前一个值,则考虑下一个值而不是差值。工作如下

Value          Count       Diff         Explanation
value1         55                       No diff as there is no previous value
value2         60            5          (60-55)
value3         75           15          (75-60) 
value4         20           20          (20 as 20 < 75)
value5         25            5          (25-20)
value6         45           20          (45-25)
value7          5            5          (5 as 5 < 45)
value8         25           20          (25-5)

查询应该给出所有差异的总和,即5+15+20+5+20+5+20 = 90

提前感谢您为我制作的精彩查询:-)

【问题讨论】:

  • 除了在 SO 上发布问题让我们为您制作查询之外,您是否尝试过任何其他方法?
  • 为了过度简化,RDBMS 表中的行没有“顺序”,因此您需要某种方式来建立顺序。这通常使用顺序(和/或递增)id 或某种时间列。 PRIMARY KEY 也是必需的,尽管此排序列可以指定为此类(的组成部分)。
  • 嗨 Ejay - 是的,我只是在尝试后才发布此内容,但我承认我是一个非常初学者。
  • 草莓 - 感谢您的评论。所有的东西都在那里,只是想让它简单易懂。

标签: mysql


【解决方案1】:

您可以使用此查询,假设您有一个表 tbl(v,c) - v 是值字段,c 是计数字段。

SELECT t1.v, t1.c as cnt1,
    case 
      when t2.c is null then 0
      when t2.c > t1.c then t1.c
      else t1.c - t2.c
    end as diff
FROM TBL T1
left outer JOIN TBL T2 ON T1.v > T2.v
where not exists (
   SELECT * 
   FROM TBL T3 WHERE T3.V < T1.V AND T3.V > T2.V
)

顺便说一句,您的结果 value3 应该是 65 而不是 75

我做了一个Fiddle 来测试它

【讨论】:

  • 感谢您的回答和更正。
  • @user2298269 不客气 :) 如果回答对您有帮助,请考虑采纳!
【解决方案2】:

你可以使用coalesce来解决这个问题

select a.Value,a.count
coalesce(a.count- 
    (select b.countfrom table_name b where b.count= a.count+ 1), a.count) as diff
from table_name  a

但这解决了你一半的问题。我不知道第二个问题的答案

see here

【讨论】:

  • 感谢您的回复。我迫切需要完整的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多