向有序交易组添加唯一 ID [关闭]
Posted
技术标签:
【中文标题】向有序交易组添加唯一 ID [关闭]【英文标题】:Add unique id to groups of ordered transactions [closed] 【发布时间】:2019-10-23 22:50:26 【问题描述】:我目前有一个表,其中包含按顺序为每个组排序的事务,如下所示:
| 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 |
我该怎么做?
【问题讨论】:
SQL 表代表 无序 集。除非您有一个指定顺序的列,否则您无法做您想做的事情。 【参考方案1】:这是间隙和孤岛问题的变体。正如 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 | 1003Demo on SQL Server 2012 DB Fiddle
【讨论】:
以上是关于向有序交易组添加唯一 ID [关闭]的主要内容,如果未能解决你的问题,请参考以下文章