sql - 向有序交易组添加唯一 ID
问题描述
我目前有一个表,其中包含按顺序为每个组排序的事务,如下所示:
| transaction_no | value |
|----------------|-------|
| 1 | 8 |
| 2 | 343 |
| 3 | 28 |
| 4 | 102 |
| 1 | 30 |
| 2 | 5 |
| 3 | 100 |
| 1 | 12 |
| 2 | 16 |
| 3 | 28 |
| 4 | 157 |
| 5 | 125 |
但是,我有兴趣添加另一列,为每个分组分配一个唯一的 ID(其中 transaction_no 以 1 开头并以 x 结尾的事务集,其中 x 之后的 transaction_no 为 1)。所以目标是这样的表:
| transaction_no | value | stmt_id |
|----------------|-------|---------|
| 1 | 8 | 1001 |
| 2 | 343 | 1001 |
| 3 | 28 | 1001 |
| 4 | 102 | 1001 |
| 1 | 30 | 1002 |
| 2 | 5 | 1002 |
| 3 | 100 | 1002 |
| 1 | 12 | 1003 |
| 2 | 16 | 1003 |
| 3 | 28 | 1003 |
| 4 | 157 | 1003 |
| 5 | 125 | 1003 |
我该怎么做?
解决方案
这是差距和孤岛问题的一种变体。正如 Gordon Linoff 所评论的那样,要解决它,您需要一个可用于对行进行排序的列。我假设这样的列存在并且被称为id
.
典型的解决方案包括对记录进行排序并执行窗口求和。当总体排名和窗口总和之间的差异发生变化时,新的组开始。
考虑以下查询:
select
id,
transaction,
value,
1000
+ rn
- sum(case when transaction_no = lag_transaction_no + 1 then 1 else 0 end)
over(order by id) grp
from (
select
t.*,
row_number() over(order by id) rn,
lag(transaction_no) over(order by id) lag_transaction_no
from mytable t
) t
使用此示例数据:
编号 | 交易号 | 价值 -: | -------------: | ----: 1 | 1 | 8 2 | 2 | 343 3 | 3 | 28 4 | 4 | 102 5 | 1 | 30 6 | 2 | 5 7 | 3 | 100 8 | 1 | 12 9 | 2 | 16 10 | 3 | 28 11 | 4 | 157 12 | 5 | 125
查询返回:
编号 | 交易号 | 价值 | grp -: | -------------: | ----: | ---: 1 | 1 | 8 | 1001 2 | 2 | 第343章 1001 3 | 3 | 28 | 1001 4 | 4 | 102 | 1001 5 | 1 | 30 | 1002 6 | 2 | 5 | 1002 7 | 3 | 100 | 1002 8 | 1 | 12 | 1003 9 | 2 | 16 | 1003 10 | 3 | 28 | 1003 11 | 4 | 157 | 1003 12 | 5 | 125 | 1003
推荐阅读
- node.js - 如何在 Node JS 中重现和防止 ESOCKETTIMEDOUT
- maven - TestNG中的测试用例不是由maven执行的
- swiftui - 在滚动视图中初始化无数据,稍后添加无显示
- typescript - 如何清除 ion-datetime ionic4 的值
- java - Spring Data Mongo 没有访问器来设置已初始化的最终属性
- sql - 具有对应值总和的 SQL 不同列
- tensorflow - 如何在不弃用的情况下修复错误 tensorflow has not attribute 'ConfigProto'?
- python - Pandas - 如何交换列内容,保持标签序列不变?
- python - 如何在 django rest 框架中附加序列化程序
- tkinter - Tkinter 防止手动输入到 Combobox