检索上一行以按日期从当前行中减去

时间:2014-01-20 21:38:10

标签: sql ms-access-2007

我的表只包含 2 字段:NAV_DateNetAssetValue

NAV_Date是一季度的最后天。

+----------+--------------+
|NAV_Date  |NetAssetValue |
+----------+--------------+
|12/31/2012|        $4,000|
+----------+--------------+
|03/31/2013|        $5,000|
+----------+--------------+

我正在尝试编写一个减去前一个更新的查询。目前,我的查询只是选择表中的所有值。我知道要执行此操作我必须每次都检索先前的记录,但是我不知道该怎么做。

最终我将使用((CurrentValue / PreviousValue) - 1)并将值存储为百分比以返回差异。

我也将按年度价值执行此操作。有没有人有一个例子,如果他们做了类似的事情或者可能是让我开始的线索?

我问的原因是因为我搜索了一个解决方案,但找不到任何有用的示例,其中没有自动编号或ID字段。

2 个答案:

答案 0 :(得分:3)

您可以使用相关子查询来执行此操作:

select NAV_date, NAV_value, (NAV_value / prev_value) - 1
from (select t.*,
             (select top 1 NAV_value
              from YOURTABLENAMEGOESHERE as t2
              where t2.NAV_date < t.NAV_date
              order by t2.NAV_date desc
             ) as prev_value
      from YOURTABLENAMEGOESHERE as t
     ) as t

答案 1 :(得分:0)

我认为你想要这样的东西,使用MySQL变量。此外,您似乎想要进行百分比变化计算,但您的公式是错误的。如果没有,请告诉我,这可以根据您的需要进行调整:

SELECT
    nt.NAV_Date,
    nt.NetAssetValue,
    (@last_value := (SELECT NetAssetValue FROM NAV_Tbl WHERE NAV_Date < nt.NAV_Date ORDER BY NAV_Date DESC LIMIT 1)) AS last_value,
    IF(@last_value,(((nt.NetAssetValue - @last_value) / @last_value) * 100),NULL) AS percent_change
FROM
    NAV_Tbl nt,
    (SELECT
        @row_num:=0,
        @last_value:=0
    ) r
ORDER BY
    NAV_Date ASC

结果(左侧列为2列,原始数据为2列,通过查询计算出2列右侧列):

==============================================
| date       | value | last_value | percent  |
==============================================
| 2012-10-01 | 3500  | NULL       | NULL     |
| 2013-01-01 | 4500  | 3500       | 28.5714  |
| 2013-04-01 | 1000  | 4500       | -77.7778 |
| 2013-07-01 | 2500  | 1000       | 150.0000 |
| 2013-10-01 | 9000  | 2500       | 260.0000 |
==============================================