2013-04-02 117 views
-1

比方说,我使用的是被称为TestTable的下面的SQL表:如何在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/23之间和2013/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 SQL函数为了简化查询,但我不知道如何做,因为我不是一个SQL maste(至少:-),但我不知道如何做。

请问你能帮我一把吗?

编辑:UPS,我认为我已经发现myselft解决方案加入了“GROUP BY名”在查询像这样的结尾:

选择名称,最大(值) - 分(值)from TestTable where date <'2013-02-23'and date>'2013-01-01'GROUP BY名称

就是这样!

+0

向我们展示您的尝试,以便我们能够告诉您您的错误在哪里。 – MarcinJuraszek

+0

我已经尝试到目前为止,以下SQL查询:从TestTable哪里日期<'2013-02-23'和日期>'2013-01-01'选择名称,最大值(value1) - min(value1),我得到“ Column TestTable.name在选择列表中是无效的,因为它不包含在聚合函数或GROUP BY子句中。 – user1108105

+0

@ user1108105:据我所知,你的问题是检索一行,比如说两个日期之间的差值。因此,你使用退休多重行动作为结果 你想要什么以及你是如何做到的(所以我们可以帮你) –

回答

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(),你可以用相关子查询类似的东西。