即使删除一个数字,如何在序列号中创建列

Posted

技术标签:

【中文标题】即使删除一个数字,如何在序列号中创建列【英文标题】:How to make column in serialised number even if one number is deleted 【发布时间】:2020-04-25 09:40:10 【问题描述】:

我有一张桌子

FieldName | FieldValue | FieldOrder 
-------------------------------------
Srl       | value1     |  0
Data      | value2     |  0
Content   | value3     |  0
Srl       | val1       |  1
Data      | val2       |  1
Content   | val3       |  1
Srl       | vall1      |  2
Data      | vall2      |  2
Content   | vall3      |  2
Srl       | data1      |  3
Data      | data2      |  3
Content   | data3      |  3

如果我要删除一些行

Delete from CatogoryFieldValueMaster where FieldOrder = 1
//It will show result as
FieldName | FieldValue | FieldOrder 
-------------------------------------
Srl       | value1     |  0
Data      | value2     |  0
Content   | value3     |  0
Srl       | vall1      |  2
Data      | vall2      |  2
Content   | vall3      |  2
Srl       | data1      |  3
Data      | data2      |  3
Content   | data3      |  3

我需要更新表格以重新排序 FieldOrder 列以显示为 0,1,2,3...。 我需要做哪些修改才能让我的表成为

FieldName | FieldValue | FieldOrder 
-------------------------------------
Srl       | value1     |  0
Data      | value2     |  0
Content   | value3     |  0
Srl       | vall1      |  1
Data      | vall2      |  1
Content   | vall3      |  1
Srl       | data1      |  2
Data      | data2      |  2
Content   | data3      |  2

请帮帮我

【问题讨论】:

【参考方案1】:

我需要更新表格以重新排序 FieldOrder 列以显示为 0,1,2,3....

如果您想更改这些值,请按照 GMB 的建议使用可更新的 CTE。但是,我会使用dense_rank() 而不是row_number() 来解决这个问题:

with toupdate as (
      select cfvm.*,
             dense_rank() over (order by FieldOrder) - 1 as new_FieldOrder
      from CatogoryFieldValueMaster cfvm
     ) 
update toupdate
    set FieldOrder = new_FieldOrder
    where FieldOrder <> new_FieldOrder;

对于您给出的示例 - 删除了整组现场订单 - 这和 GMB 的解决方案做同样的事情。如果删除一行,则它们会产生不同的结果。对我来说,这更明智,但你并没有明确你真正想要做什么。

【讨论】:

【参考方案2】:

我不建议存储这些派生信息 - 因为,正如您所发现的,维护它很复杂(可能,您需要在每次数据更改后重新编号整个表)。

相反,您可以在视图中使用row_number() 即时计算它:

create view CatogoryFieldValueMasterView as
select 
    FieldName,
    FieldValue,
    row_number() over(partition by FieldName order by FieldValue) - 1 FieldOrder
from CatogoryFieldValueMaster

也就是说,如果您确实需要 update 语句,这里有一个使用可更新 cte 的选项:

with cte as (
    select 
        FieldOrder,
        row_number() over(partition by FieldName order by FieldValue) - 1 FieldOrderNew
    from CatogoryFieldValueMaster
) 
update cte set FieldOrder = FieldOrderNew

【讨论】:

以上是关于即使删除一个数字,如何在序列号中创建列的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark:如何在不同条件的数据框中创建列

如何根据行创建日期在 PostgreSQL 中创建自定义序列?

如何使用python在streamlit和plotly中创建列?

在 pyspark 中创建列数组

带有 PL SQL 的序列

如何使用 SQL Server Management Studio (2008) 在 SQL Server Compact Edition 中创建列