在sql查询中累积几天的数据

发布于 2024-12-01 09:07:50 字数 608 浏览 1 评论 0原文

我有两个表,第一个(T1)是一个基数,第一个是每个符号的基值:

symbol       value
------------ -----
ABC           1000
DEF           2000

第二个表(T2)是每个日期的一系列值,即:

date         symbol value
----------   ------ -----
2011-09-01   ABC      100
2011-09-02   ABC       10
2011-09-03   ABC        1

我需要什么查询才能获得累计总数在几天内将值列添加到第一列中的初始值。因此查询的输出看起来像这样

symbol date       total
------ ---------- ------
ABC    2011-09-01   1100
ABC    2011-09-02   1110
ABC    2011-09-03   1111

,所以它是 T1 中的初始值的总和加上小于该列中的日期的所有日期的总和。

其目标数据库是 iSeries 上的 DB2

I have two tables, the first (T1) is a base number, the first is a base value per symbol:

symbol       value
------------ -----
ABC           1000
DEF           2000

The second table (T2) s a series of values per date, i.e.:

date         symbol value
----------   ------ -----
2011-09-01   ABC      100
2011-09-02   ABC       10
2011-09-03   ABC        1

What query would I require to get the accumulated total of the value column added to the initial value in the first column over the several days. So the output of the query would look something like

symbol date       total
------ ---------- ------
ABC    2011-09-01   1100
ABC    2011-09-02   1110
ABC    2011-09-03   1111

So its the sum of the inital value in T1 plus the sum of all dates less than the date in that column.

The target database for this is DB2 on iSeries

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

天赋异禀 2024-12-08 09:07:50

SQL 方法

select 
   a.symbol, 
   a.value  --current value
     + COALESCE((select sum(value) 
        from T2 b 
        where 
           b.date < a.date and
           b.symbol=a.symbol
        ),0) --sum of history
     + c.value --initial value
from 
   t2 a join t1 c on (a.symbol = c.symbol)

An SQL approach

select 
   a.symbol, 
   a.value  --current value
     + COALESCE((select sum(value) 
        from T2 b 
        where 
           b.date < a.date and
           b.symbol=a.symbol
        ),0) --sum of history
     + c.value --initial value
from 
   t2 a join t1 c on (a.symbol = c.symbol)
自由如风 2024-12-08 09:07:50

您必须使用 窗口函数

SELECT T1.symbol, T2.date, COALESCE(T1.value, 0)+sum(T2.value) over (PARTITION BY T2.symbol ORDER BY T2.date)
FROM T2
    LEFT JOIN T1 ON T1.symbol = T2.symbol
ORDER BY T1.symbol, T2.date

编辑

适用于 PostgreSQL,根据 DB2 9.7 LUW 文档,它也应该适用于DB2。

You have to use window functions:

SELECT T1.symbol, T2.date, COALESCE(T1.value, 0)+sum(T2.value) over (PARTITION BY T2.symbol ORDER BY T2.date)
FROM T2
    LEFT JOIN T1 ON T1.symbol = T2.symbol
ORDER BY T1.symbol, T2.date

EDIT

Works on PostgreSQL, according to DB2 9.7 LUW docs it should work also on DB2.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文