向有序交易组添加唯一 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 | 1003

Demo on SQL Server 2012 DB Fiddle

【讨论】:

以上是关于向有序交易组添加唯一 ID [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

PHP 向Drupal菜单项添加唯一ID

PHP 使用PHP向body元素添加唯一ID

向Drupal菜单项添加唯一ID

在 Jquery 或 Javascript 中向附加表单添加唯一 ID

使用PHP向body元素添加唯一的ID

动态添加/删除表单组并为每个输入提供唯一的 ID 和名称