【问题标题】:SQL query to keep track of new orders or balance changes in old orders without datesSQL查询以跟踪新订单或旧订单中的余额变化,没有日期
【发布时间】:2021-07-22 01:54:44
【问题描述】:

我有一个记录类似于以下的表

order_id order_balance
34 400
35 200
36 100

一旦插入 order_id,即 order_id = 34。当 order_balance 更改时,不会插入新记录(不是追加),余额本身会在同一记录中更新。所以说order_id=34 的余额明天变为300。当你明天看表时。

order_id = 34 的记录如下所示:

order_id order_balance
34 300

所以我想建立一个表来跟踪新插入的 order_ids 和 order_balances,或者在最后一天(或时间段,可能是小时、天、分钟等)发生余额变化.我正在使用 pyspark 和 spark sql。

我的第一个想法是创建一个表格来记录昨天的余额,然后将它们与今天的余额进行比较。但是,这将是 spark 作业的两次单独运行,并且需要我在 spark 中的作业运行之间保留该表。这甚至可能吗?

【问题讨论】:

  • 根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。
  • SQL Server SQLite - 请更正您的标签。
  • 还要注意表格格式代码。
  • 顺便说一句-您熟悉“接受”答案吗?我注意到你还没有接受任何东西。
  • 您好,感谢您的 cmets,我已经更正了我的标签,并添加了我对如何继续进行的初步思考过程。我还没有接受答案,因为我的问题略有改变,我还没有找到答案。

标签: sql apache-spark-sql batch-processing


【解决方案1】:

您是否尝试过在插入/更新后触发?然后它会根据你想要的规则插入或更新新的“control_table”。

或者,如果我理解正确,你可以有这样的视图:

CREATE VIEW v_changed_orders_last_day AS
SELECT 
    order_id, 
    order_balance, 
    order_updated_date
FROM orders
WHERE order_updated_date IS NULL 
   OR order_updated_date >= sysdate()-1;

【讨论】:

  • 如果我没有订单日期怎么办,我只有order_id和表中的余额。当余额发生变化时,旧余额会在同一记录中被覆盖。在这种情况下,我将如何跟踪 order_ids 的余额变化?
  • 您必须创建一个新表进行控制并使用触发器。下面是 ORACLE 的示例。语法可能因数据库而异: CREATE TRIGGER my_trigger AFTER INSERT OR UPDATE ON original_table FOR EACH ROW BEGIN -- 将记录插入控制表 INSERT INTO control_table (order_id, old_order_balance, new_order_balance, date) VALUES (:new.order_id, :old .order_balance, -- 订单余额的旧值 :new.order_balance, -- 订单余额的新值 sysdate() -- 时间戳);结束;
【解决方案2】:

您想跟踪更改...将表格转换为System-Versioned Temporal Table.

现在 SQL Server 将通过为该表创建一个日志表来跟踪对该表所做的每一次更改。

【讨论】:

    【解决方案3】:

    您必须创建一个新表进行控制并使用 TRIGGER。下面是 ORACLE 的示例。语法可能因数据库而异:

    CREATE OR REPLACE TRIGGER my_trigger
    AFTER INSERT OR UPDATE
       ON original_table
       FOR EACH ROW
    
    BEGIN
       -- Insert record into control table
       INSERT INTO control_table
       ( order_id,
         old_order_balance,
         new_order_balance,
         date )
       VALUES
       ( :new.order_id,
         :old.order_balance,  --gets the old value for order balance
         :new.order_balance,  --gets the new value for order balance
         sysdate()            --gets the timestamp when it occurred
        );
    END;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      • 2012-07-23
      • 1970-01-01
      相关资源
      最近更新 更多