我有一张像这样的桌子

timestamp type value
08.01.2023 1 5
07.01.2023 0 20
06.01.2023 1 1
05.01.2023 0 50
04.01.2023 0 50
03.01.2023 1 1
02.01.2023 1 1
01.01.2023 1 1

类型1表示存款,类型0表示取款. 问题是,当类型是1时,金额就是用户存入的确切金额,所以我们可以将其相加,但类型0意味着按百分比取款. 我正在寻找的是创建另一个列与当前的存款金额.对于上面的例子,它应该是这样的.

timestamp type value deposited
08.01.2023 1 5 5.4
07.01.2023 0 20 1.4
06.01.2023 1 1 1.75
05.01.2023 0 50 0.75
04.01.2023 0 50 1.5
03.01.2023 1 1 3
02.01.2023 1 1 2
01.01.2023 1 1 1

我想不出怎么算出这样的总和,它会减go 之前总数的百分比

推荐答案

您正在try 随时间传送状态,因此需要使用UDTF来为您执行传送工作.或者使用recursive CTE

with data(transaction_date, type, value) as (
    select to_date(column1, 'dd.mm.yyyy'), column2, column3
    from values
        ('08.01.2023', 1, 5),
        ('07.01.2023', 0, 20),
        ('06.01.2023', 1, 1),
        ('05.01.2023', 0, 50),
        ('04.01.2023', 0, 50),
        ('03.01.2023', 1, 1),
        ('02.01.2023', 1, 1),
        ('01.01.2023', 1, 1)
), pre_process_data as (
    select *
        ,iff(type = 0, 0, value)::number as add
        ,iff(type = 0, value, 0)::number as per
        ,row_number()over(order by transaction_date asc) as rn
    from data 
), rec_cte_block as (
    with recursive rec_sub_cte as (
        select 
            p.*,
            p.add::number(20,4) as deposited
        from pre_process_data as p
        where p.rn = 1
        
        union all 
        
        select 
            p.*,
            round(div0((r.deposited + p.add)*(100-p.per), 100), 2)  as deposited
        from rec_sub_cte as r
        left join pre_process_data as p
        where p.rn = r.rn+1
    )
    select * 
    from rec_sub_cte
)
select * exclude(add, per, rn)
from rec_cte_block
order by 1;

我以这种方式编写递归CTE,因为如果在CTE中使用IFF或CASE,则当前会发生事件.

TRANSACTION_DATE TYPE VALUE DEPOSITED
2023-01-01 1 1 1
2023-01-02 1 1 2
2023-01-03 1 1 3
2023-01-04 0 50 1.5
2023-01-05 0 50 0.75
2023-01-06 1 1 1.75
2023-01-07 0 20 1.4
2023-01-08 1 5 6.4

Sql相关问答推荐

提取Snowflake SQL中的嵌套键

帮助修复查询以识别SQL DW中数据中的递归关系

将有界时间周期作为阶跃函数,其中周期开始返回1,周期结束返回0

SQL(PostgreSQL)从条件创建点表

如何在联接条件不匹配时按日期获取上一条记录

如何从JSON数组中 Select 多个值

Ffltter&;Dart SQL Lite包:是否可以在一个查询中执行多条更新语句(每次执行不同的WHERE参数)

SQL子查询返回多个值错误

查询页面推荐

如何为该查询编写正确分区依据

嵌套Json对象的SQL UPDATE WHERE

如何简化此PostgreSQL查询以计算平均值?

按用户和时间列出的SQL Group考勤列表

TSQL如何为群分配号码

SQL JSON_QUERY 使用列中的值构造 json 路径并接收错误

当 2 列具有静态值并且第 3 列使用运算符 IN 时,对 PostgreSQL 和 3 列上的复杂索引的最佳查询

如何在 postgres 中旋转某些数据字段

删除重复记录但保留最新的SQL查询

SQL 函数 DIFFERENCE 返回有趣的分数

SQLite 中的过滤运行总和视图