从SQL获取历史值

时间:2016-08-02 10:23:03

标签: sql

我有一个纵向表格,其中包括日期和余额。我需要提取6个变量,其中包含过去6个月中每一个的余额。这看起来好像应该非常容易,但到目前为止我没有运气使用case或if语句中的select。

我的整个程序按日期循环访问我的数据。

使用看起来像这样的表:

col1    |col2   |account    |date   |balance    |col3   |col4
--------------------------------------------------------------
        |       |123456     |Jul-16 |1200       |       |
        |       |123456     |Jun-16 |1100       |       |
        |       |123456     |May-16 |1000       |       |
        |       |123456     |Apr-16 |900        |       |
        |       |123456     |Mar-16 |800        |       |
        |       |123456     |Feb-16 |700        |       |
        |       |123456     |Jan-16 |600        |       |
        |       |123456     |Dec-15 |500        |       |
        |       |123456     |Nov-15 |400        |       |
        |       |123456     |Oct-15 |300        |       |
        |       |123456     |Sep-15 |200        |       |
        |       |123456     |Aug-15 |100        |       |
        |       |234567     |Jul-16 |-500       |       |
        |       |234567     |Jun-16 |-400       |       |
        |       |234567     |May-16 |-600       |       |
        |       |234567     |Apr-16 |-500       |       |
        |       |234567     |Mar-16 |-200       |       |
        |       |234567     |Feb-16 |-400       |       |
        |       |345678     |Jul-16 |100        |       |
        |       |345678     |Jun-16 |200        |       |
        |       |345678     |May-16 |300        |       |
        |       |345678     |Apr-16 |400        |       |
        |       |345678     |Mar-16 |500        |       |     

我会要求变量b1-b6在过去6个月内为每个帐户提供余额。

2 个答案:

答案 0 :(得分:1)

很难判断这是否正是您正在寻找的,但如果您正在寻找6个月内每个帐户累积的余额,以下内容可能有所帮助。

   SELECT  account, SUM(balance)
    FROM    Table_1 
    WHERE   date >= '2013-02-02' AND
            date <= '2013-08-02'
GROUP BY account

&#39; GROUP BY&#39;函数将汇总汇总变量或SUM(balance)每个帐户&#39;而where子句将返回日期范围的聚合值。您可以将其他变量添加到select语句和&#39; GROUP BY&#39;。

答案 1 :(得分:1)

虽然这基本上是每组前N个问题,但看起来你每个月都会持续获得数据,这样可以更容易处理。

select t.*
from
    <T> t inner join
    (select account, max(date) as max_date from <T> group by account) m
        on m.account = t.account and t.date > max_date - 6 months /* pseudo-code */

您必须根据业务规则计算六个月的回顾。可能还有一些小的并发症,月末接近月份(尤其是2月份)。这只是一种粗略的模板,可能可能在您的平台上运行。根据您可以做出的假设,有可能对此进行优化。