sql计算2行之间的差异

时间:2014-12-16 14:23:27

标签: sql sybase-ase

我正在寻找一种比较同一表中2行差异的方法。从我在这里找到的(How to get difference between two rows for a column field?),这几乎是我想要的。我已经完成了以下代码:

create table #tmpTest
(
    id_fund int null,
    id_ShareType int null,
    ValueDate datetime null,
    VarNAV float null,
    FundPerf float null,
)

insert into #tmpTest(id_fund, id_ShareType, ValueDate, VarNAV)
values(1,1,'20140101',100)
insert into #tmpTest(id_fund, id_ShareType, ValueDate, VarNAV) 
values(1,1,'20140102',20)

update #tmpTest
set hrc.FundPerf = (isnull(hrn.VarNAV, 0) - hrc.VarNAV)/hrc.VarNAV
from #tmpTest hrc 
left join #tmpTest hrn on hrn.ValueDate = (select min(ValueDate) from #tmpTest where ValueDate > hrc.ValueDate)
and hrc.id_fund = hrn.id_fund and hrc.id_ShareType = hrn.id_ShareType 

我的问题是,我正在计算的结果从第1行而不是第2行开始。

以下是我获得的结果:

id_fund id_ShareType ValueDate           VarNAV                       FundPerf                     
------- ------------ ------------------- ------- -----------------------------
      1            1 2014-01-01 00:00:00     100                          -0.8
      1            1 2014-01-02 00:00:00      20                            -1

虽然我希望它是这样的:

id_fund id_ShareType ValueDate           VarNAV                       FundPerf                     
------- ------------ ------------------- ------- -----------------------------
      1            1 2014-01-01 00:00:00     100                            -1
      1            1 2014-01-02 00:00:00      20                          -0.8

我的方法出了什么问题?

3 个答案:

答案 0 :(得分:1)

您不是将最低限制为同一基金和股票类型。

update #tmpTest
    set hrc.FundPerf = (isnull(hrn.VarNAV, 0) - hrc.VarNAV)/hrc.VarNAV
    from #tmpTest hrc left join
         #tmpTest hrn
         on hrn.ValueDate = (select min(ValueDate)
                             from #tmpTest tt
                             where tt.ValueDate > hrc.ValueDate and
                                   hrc.id_fund = tt.id_fund and hrc.id_ShareType = tt.id_ShareType 
                            ) and
           hrc.id_fund = hrn.id_fund and hrc.id_ShareType = hrn.id_ShareType ;

答案 1 :(得分:0)

试试这个:

update hrn
set FundPerf = (isnull(hrn.VarNAV, 0) - hrc.VarNAV)/hrc.VarNAV
from #tmpTest hrc 
left join #tmpTest hrn on hrn.ValueDate = (select min(ValueDate) from #tmpTest where ValueDate > hrc.ValueDate)
and hrc.id_fund = hrn.id_fund and hrc.id_ShareType = hrn.id_ShareType 

答案 2 :(得分:0)

您可以通过CTE(公用表格表达)

来实现这一目的
create table #tmpTest
(
    id_fund int null,
    id_ShareType int null,
    ValueDate datetime null,
    VarNAV float null,
    FundPerf float null,
)

insert into #tmpTest(id_fund, id_ShareType, ValueDate, VarNAV)
values(1,1,'20140101',100)
insert into #tmpTest(id_fund, id_ShareType, ValueDate, VarNAV) 
values(1,1,'20140102',20)

;With tbl as

( Select Row_Number() OVER (Order by T.ValueDate) as RowNumber,* From #tmpTest T )SELECT Cur.*,(ISNULL(Cur.VarNAV,0) - ISNULL(Prv.VarNAV,0))/Prv.VarNAV as [Col Name] FROM tbl Cur LEFT OUTER JOIN tbl Prv ON Cur.RowNumber = Prv.RowNumber+1 ORDER BY Cur.ValueDate