gpt4 book ai didi

sql - 在 SQL Server 2012 中根据 row_number 更新行

转载 作者:行者123 更新时间:2023-12-04 22:07:03 24 4
gpt4 key购买 nike

我在电子表格中获得了一些数据,这些数据很快将自动导入,因此我无法在电子表格上进行任何手动输入。数据基本上有以下列。 Trayid、trayname、itemdescription 和 rownumber。我没有自己构建这些表,否则我会以不同的方式构建它,但我必须坚持已经设置的格式。

正在导入的数据将在后面查看。

Trayid | Trayname | ItemDescription | RowNumber
1 Tray 1 Product 1 1
Product 2 2
Product 3 3
Product 4 4
2 Tray 2 Product 1 1
Product 2 2
Product 3 3
Product 4 4
Product 5 5

我需要做的是为第 1 行之后的每一行更新 trayid 和 trayname,例如它看起来像。

Trayid | Trayname | ItemDescription | RowNumber
1 Tray 1 Product 1 1
1 Tray 1 Product 2 2
1 Tray 1 Product 3 3
1 Tray 1 Product 4 4
2 Tray 2 Product 1 1
2 Tray 2 Product 2 2
2 Tray 2 Product 3 3
2 Tray 2 Product 4 4
2 Tray 2 Product 5 5

我想我需要使用光标之类的东西,但我不确定,我认为这可以通过降低行号并在再次看到行号 1 时停止然后继续下一个托盘 ID 和托盘名称来完成。

抱歉,如果我需要的东西没有意义,解释起来很尴尬。

最佳答案

SQL 表没有固有的顺序。所以你不能依赖它。但是,您可以做一些事情:

  • 在源表中定义一个identity 列。
  • 在排除身份的源表上创建一个 View 。
  • 批量插入到 View 中。

这将按照与原始数据相同的顺序为行分配一个序列号。我们称它为 id。然后您可以通过以下方式进行更新:

with toupdate (
select t.*,
max(TrayId) over (partition by grp) as new_TrayId,
max(TrayName) over (partition by grp) as new_TrayName
from (select t.*,
count(TrayId) over (order by id) as grp
from t
) t
)
update toupdate
set TrayId = new_TrayId,
TrayName = new_TrayName
where TrayId is null;

这个想法是定义对应于每个托盘的行组。简单的想法是计算任何给定行之前非 NULL 值的数量——然后组中的所有内容都将具有相同的 grp 值。然后窗口函数将实际值分布到组中的所有行(使用 max()),这些值用于更新。

关于sql - 在 SQL Server 2012 中根据 row_number 更新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27122333/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com