如何从SQL中的不同日期之间减去值?

时间:2013-04-02 09:21:20

标签: sql max min

假设我正在使用以下名为TestTable的SQL表:

Date       Value1      Value2     Value3 ... Name
2013/01/01    1           4         7        Name1
2013/01/14    6           10        8        Name1
2013/02/23    10          32        9        Name1

我希望得到日​​期之间值的增量,例如:

Value1Inc  Value2Inc Value3Inc Name
4          22        1         Name1

介于2013/02/232013/01/14之间。

请注意,值总是递增。我正在尝试在StackOverflow中找到以下方法:

select (
(select value1 from TestTable where date < '2013/01/14') -
(select value1 from TestTable where date < '2013/02/23')
) as Value1Inc,

(select value2 from TestTable where date < '2013/01/14') -
(select value2 from TestTable where date < '2013/02/23')
as Value2Inc
...

等等,但这种方法给了我一个巨大的疑问。

我想使用MAX&amp; MIN SQL函数是为了简化查询,但我不知道怎么做,因为我不是一个SQL maste(至少还是: - )。

你能帮我们帮忙吗?

编辑:Ups,我认为我已经通过myselft找到了解决方案,在查询末尾添加了“GROUP BY Name”,如下所示:

从TestTable中选择name,max(value1) - min(value1),其中date&lt; '2013-02-23'和日期&gt; '2013-01-01'GROUP BY Name

就是这样!

1 个答案:

答案 0 :(得分:0)

您希望使用联接匹配下一条记录。可能最简单的方法是枚举和加入:

with tt as (
      select tt.*, row_number() over (partition by name order by date) as seqnum
      from testtable tt
     )
select tt.name, tt.date, ttnext.date as nextdate,
       (ttnext.value1 - tt.value1) as Diff_Value1,
       (ttnext.value2 - tt.value2) as Diff_Value2,
       (ttnext.value3 - tt.value3) as Diff_Value2
from tt left outer join
     tt ttnext
     on tt.seqnum = ttnext.seqnum - 1;

如果您的数据库不支持row_number(),您可以使用相关子查询执行类似操作。