【问题标题】:Looping SQL server records with GROUP BY to update value for the group使用 GROUP BY 循环 SQL 服务器记录以更新组的值
【发布时间】:2020-05-28 14:43:07
【问题描述】:

我有一个如下所示的 CustomerSales 表:

[RowID], [Cust], [Time], [Article], [Qty], [Amount], [Receipt]
1, C1, 10:10:00, A1, 1, 100, 1
2, C1, 10:10:00, A2, 2, 101, 1
3, C1, 10:10:00, A3, 3, 102, 1 
4, C1, 10:10:00, A4, 4, 103, 1
5, C2, 10:10:11, A3, 5, 104, 1
6, C3, 10:20:01, A2, 6, 105, 1
7, C4, 10:20:01, A2, 7, 106, 1
8, C4, 10:20:01, A1, 8, 107, 1
9, C1, 11:11:01, A2, 3, 100, 1
10, C1, 11:11:01, A3, 2, 101, 1

我的数据没有收据编号。因此,要求是为收据编号生成一个线性编号。例如从 1 开始并以 1 递增。 要确定哪些行项目属于给定收货编号,可以按 [Cust] 和 [Time] 对记录进行分组。属于 [Cust] 和 [Time] 组的所有行都将更新为 MAX(Receipt]+1(下一个可用的收据编号)。

预期结果如下:

[RowID], [Cust], [Time], [Article], [Qty], [Amount], [Receipt]
1, C1, 10:10:00, A1, 1, 100, 1, 1
2, C1, 10:10:00, A2, 2, 101, 1, 1
3, C1, 10:10:00, A3, 3, 102, 1, 1 
4, C1, 10:10:00, A4, 4, 103, 1, 1
5, C2, 10:10:11, A3, 5, 104, 1, 2
6, C3, 10:20:01, A2, 6, 105, 1, 3
7, C4, 10:20:01, A2, 7, 106, 1, 4
8, C4, 10:20:01, A1, 8, 107, 1, 4
9, C1, 11:11:01, A2, 3, 100, 1, 5
10, C1, 11:11:01, A3, 2, 101, 1, 5

【问题讨论】:

标签: sql sql-server sql-update


【解决方案1】:

你可以使用dense_rank():

select t.*,
       dense_rank() over (order by time, cust) as receipt
from t;

如果要更新数据,请使用可更新的 CTE:

with toupdate as (
      select t.*,
             dense_rank() over (order by time, cust) as new_receipt
      from t
     )
update toupdate
    set receipt = new_receipt;

【讨论】:

  • 我只是想说我没有意识到你可以像这样更新 CTE。这很有用。
  • 非常感谢戈登。这是一个非常优雅的解决方案,并且可以完美运行!
  • @digital.aaron 。 . .在 SQL Server 中可以,但在大多数其他数据库中是不允许的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-15
相关资源
最近更新 更多