sqlite 连接两个SQL查询

wfypjpf4  于 2023-05-18  发布在  SQLite
关注(0)|答案(1)|浏览(190)

编辑:我删除了前面的SQL查询,使事情更容易-不需要像我前面说的那样连接两个查询。
stock_tracking_negociacao表(为了简化,我只过滤了一个代码“LEVE 3”):

#;data;tipo;mercado;ticker;quantidade;preco;valor
606;2019/12/02;Compra;Mercado à Vista;LEVE3;400;24.95;9980
437;2020/03/19;Compra;Mercado à Vista;LEVE3;100;18.05;1805
775;2021/06/10;Venda;Mercado à Vista;LEVE3;200;35.74;7148
716;2021/08/11;Venda;Mercado à Vista;LEVE3;300;33.6;10080
1214;2022/07/21;Compra;Mercado à Vista;LEVE3;600;23.7;14220
1564;2023/03/13;Compra;Mercado à Vista;LEVE3;200;32;6400

其中:

  • 数据=日期
  • tipo:'Compra' = 'Buy' and 'Venda' = 'Sell'
  • quantidade =数量
  • preco =价格
  • 价值=金额 * 价格

我需要用相同的stock_tracking_negociacao表构建一个查询。表必须按日期(data)从最早记录到最新记录排序。
我的目标是为每一行构建两个新列(不管它出现了多次):balanceavg_price
解释新列:

  1. balance:如果tipo = Compra,我们需要从以前的记录中添加quantidade。否则,如果tipo = Venda,我们需要从以前的记录中减去quantidade。每个自动收报机的第一条记录有balance = quantidade
  2. avg_price:如果tipo = Compra,则((preco * quantidade) + ([previous] balance * [previous] avg_price)) / (quantidade + [previous] balance)。如果tipo = Venda,则avg_price = [previous] avg_price。每个自动收报机的第一条记录有avg_price = preco。在MS Excel中,它与SUMPRODUCT非常相似。
    预期结果:

谢谢

juud5qan

juud5qan1#

您现有的查询能够产生想要的结果,我也包含了前面的quantidade,但似乎不需要:

WITH RECURSIVE negociacao
AS (
    SELECT row_number() OVER (
            PARTITION BY ticker ORDER BY ticker, data
            ) AS seq, data, ticker, tipo, preco, quantidade AS qnt
          , coalesce(lag(quantidade) over(partition by ticker
                                 order by data ASC),0) as prev_qnt
    FROM stock_tracking_negociacao
    WHERE tracking IS NULL
    ), adjust_table
AS (
    SELECT *, SUM(CASE WHEN tipo = 'Compra' THEN qnt ELSE - qnt END) OVER (
            PARTITION BY ticker ORDER BY seq
            ) AS balance
    FROM negociacao
    ), recurse
AS (
    SELECT adjust_table.*, preco AS avg
    FROM adjust_table
    WHERE seq = 1
    
    UNION ALL
    
    SELECT n.*, CASE WHEN n.tipo = 'Compra' THEN ((n.preco * n.qnt * 1.0) + (s.balance * s.avg)) / (n.qnt + s.balance) ELSE s.avg END AS avg
    FROM adjust_table n
    INNER JOIN recurse s ON n.seq = s.seq + 1
        AND n.ticker = s.ticker
    )

SELECT
       *
  --, round(balance * medio, 2) AS valor_total
FROM recurse
seq资料自动收报机蒂波前科qnt上一页_qnt天平平均
12019年12月12日LEVE3孔普拉二十四点九五四百0四百二十四点九五
2020/03/19LEVE3孔普拉十八点零五分一百四百五百二十三点五十七
2021/06/10LEVE3文达35.74两百一百三百二十三点五十七
2021/08/11LEVE3文达三十三点六三百两百0二十三点五十七
2019 - 07 - 21 2019 - 07 - 21LEVE3孔普拉二十三点七六百三百六百二十三点七
2023年3月13日LEVE3孔普拉三十二两百六百八百二十五点七七五

fiddle

相关问题