sql - 用于分组事务的数据库模式模式
问题描述
我正在研究一个会计系统,其中有一种方法可以恢复错误进行的交易。有些流程在生成交易的发票上运行。一个流程可以为一张发票生成多笔交易。可以在发票上运行多个进程。
架构如下所示:
Transactions
========================================================
Id | InvoiceId | InvoiceProcessType | Amount | CreatedOn
1 1 23 10.00 Today
2 1 23 13.00 Today
3 1 23 17.00 Yesterday
4 1 23 32.00 Yesterday
现在 1 和 2 一起发生,3 和 4 一起发生,我想恢复后者(3,4),将它们分组的可能解决方案是什么。
一种可能的解决方案是添加一个ProcessCount
在每个进程上递增的列。新架构如下所示。
Transactions
==============================================================================
Id | InvoiceId | InvoiceProcessType | Amount | CreatedOn | ProcessCount
1 1 23 10.00 Today 1
2 1 23 13.00 Today 1
3 1 23 17.00 Yesterday 2
4 1 23 32.00 Yesterday 2
还有其他方法可以实现吗?TIA
解决方案
如果您将批处理基于createdon
日期/时间值之间的任意时间范围,那么您可以使用lag()
和累积总和。例如,如果两行在一小时内属于同一批次,则:
select t.*,
sum(case when prev_createdon > dateadd(hour, -1, createdon) then 0 else 1 end) over
(partition by invoiceid order by createdon, id) as processcount
from (select t.*,
lag(createdon) over (partition by invoiceid order by createdon, id) as prev_createdon
from transactions t
) t;
也就是说,您的处理似乎需要增强。每次代码运行时,都应该在某个表中插入一行(比如processes
)。从该插入生成的 id 应该用于插入到transactions
. 这样,您可以保留有关何时——以及谁和什么等等——插入特定交易的信息。
推荐阅读
- python - 限制电话号码,正则表达式仅以字符“+”开头
- javascript - 用嵌套数据反应选择
- node.js - JestJS.io:TypeError [ERR_INVALID_FILE_URL_PATH]:文件 URL 路径必须是绝对的
- python - How to filter out numbers from a string if it matches the template?
- sql - 当您将表格与公共列组合时重叠日期逻辑 - 领先或滞后
- python - Pytorch 打印导入模型中发生的情况(临时矩阵)
- flask - 为什么所有注册用户都是 AnonymousUserMixin?
- python - 如何嵌套“for循环”n次?
- php - 从ajax发送数据时在php中获取未定义的索引
- elasticsearch - 相关数据的弹性查询