首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >postgresql中的可挠性求和

postgresql中的可挠性求和
EN

Stack Overflow用户
提问于 2015-10-18 10:36:45
回答 1查看 34关注 0票数 2

我有一张桌子如下:

代码语言:javascript
复制
def, amount , date
add    5       1.1.15
add    5       2.1.15
add    1       3.1.15
remove 5       4.1.15
add    4       4.1.15
make   8       4.1.15
add    5       4.1.15

我需要编写一个查询,该查询执行def的操作(添加/删除)并表示它,如果有其他操作,则应该显示最后一行值:

代码语言:javascript
复制
def, amount , date        , afterdone
add    5       1.1.15           5
add    5       2.1.15           10            / 5+5
add    1       3.1.15           11            / 10+1
remove 5       4.1.15            6            /11-5
add    4       4.1.15           10            /6+4
make   8       4.1.15           10            / 10 the value row above
add    5       4.1.15           15            /10+5

您可以假设行已经按需要排序。

我想用窗口函数来做一些事情

代码语言:javascript
复制
ROWS between UNBOUNDED PRECEDING and CURRENT ROW 

但它不执行mulipule操作(它不知道什么是添加、删除、制造.)

我该怎么做?

编辑:使它变得简单..。假设这是起源表。在哪里我定义了谁在谁之前。

代码语言:javascript
复制
id    def, amount , date
 1   add    5       1.1.15
 2   add    5       2.1.15
 3   add    1       3.1.15
 4   remove 5       4.1.15
 5   add    4       4.1.15
 6   make   8       4.1.15
 7   add    5       4.1.15
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-18 11:12:00

您可以使用窗口函数来完成这一任务,前提是您有一个列指定排序。SQL表表示无序集。您需要一个列来订购。所以:

代码语言:javascript
复制
select t.*,
       sum(case when def = 'add' then amount
                when def = 'remove' then - amount
                else 0
           end) over (order by date, id)
from atable t;

这假设iddate之后的次要排序列。但是,如果date有一个时间组件,那么这是不必要的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33196944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档