【问题标题】:Update a column with the max trackingNumber and increment by 1使用最大 trackingNumber 更新列并增加 1
【发布时间】:2021-11-30 02:42:10
【问题描述】:

我在 SQL Server 中构建了一个查询,该查询正在查找最大跟踪编号,并将跟踪编号为零的作业中具有相同批号的每条记录的当前值加 1。我的查询是用相同的编号更新此作业中的所有记录。我需要这项工作中的每条记录都有不同的编号。

这是我的查询:

UPDATE TEST.DBO.J_CordToolARCCutSheetPlanning 
SET TrackingNumber = (SELECT (MAX(trackingNumber) + 1) AS track 
                      FROM TEST.DBO.J_CordToolARCCutSheetPlanning j)
WHERE JobNumber = '1234' 

示例:

Job   LotNO        SerialNo TrackingNumber
------------------------------------------
1234  199111 -001  40001    0
1234  199111 -001  40033    0
1234  199111 -004  40050    0
1234  199111 -004  40051    0
1234  199111 -008  40111    5
1234  199111 -008  40112    5

在此示例中,最大跟踪编号为 5。

我需要它以最大 (5) 加一的方式更新每条记录。

这就是我需要它做的事情

Job   LotNO        SerialNo TrackingNumber
------------------------------------------
1234  199111 -001  40001    6
1234  199111 -001  40033    6
1234  199111 -004  40050    7
1234  199111 -004  40051    7
1234  199111 -008  40111    5
1234  199111 -008  40112    5

【问题讨论】:

  • 但是您的示例数据不是将每一行更新1?您要为同一个批号重复使用同一个跟踪号?
  • 如果 job 和 lotNo 是相同的更新,则使用最大编号更新跟踪编号(示例中为 5 加 1。
  • 那么请更新您的问题以澄清这一点,因为目前您说“我需要这项工作中的每条记录都有不同的编号。”
  • 你熟悉"accepting an answer"吗?

标签: sql sql-server tsql


【解决方案1】:

您可以使用可更新的 CTE 来完成一个唯一的行号,如下所示,使用 dense_rank 生成您需要的值。

注意:就目前而言,您的描述与您想要的结果不一致。您的描述说明了一个唯一的行号,而您想要的结果显示了每个批号的通用跟踪号。

此外,您最好使用自动序列(标识列或序列)而不是手动计算。

with cte as (
    -- Choose a suitable ordering column
    select
        -- Sample data assigns the same number for the entire lot
        dense_rank() over (order by LotNo) rn
        -- If a unique number per row is required (as written) use row_number
        --row_number() over (order by LotNo, SerialNo) rn
    from dbo.J_CordToolARCCutSheetPlanning
    where JobNumber = '1234'
    and TrackingNumber = 0
)
update cte set TrackingNumber = dr + (select max(trackingNumber) + 1 from dbo.J_CordToolARCCutSheetPlanning);

【讨论】:

    【解决方案2】:

    使用DENSE_RANK窗口函数对LotNO中的行进行排名,并将结果与​​最大值trackingNumber相加

    UPDATE
        J_CordToolARCCutSheetPlanning 
    SET
        J_CordToolARCCutSheetPlanning.TrackingNumber = CASE WHEN t.trackingNumber != t.max_trackingNumber THEN t.max_trackingNumber + t.seq ELSE t.trackingNumber END
    FROM
      (SELECT *,
           DENSE_RANK() over(ORDER BY t.LotNO) AS seq,
           (SELECT MAX(trackingNumber) FROM J_CordToolARCCutSheetPlanning) AS max_trackingNumber
      FROM J_CordToolARCCutSheetPlanning t
      WHERE JobNumber = '1234') t
    WHERE J_CordToolARCCutSheetPlanning.SerialNo = t.SerialNo
    

    db<>fiddle中的演示

    【讨论】:

      猜你喜欢
      • 2014-11-18
      • 1970-01-01
      • 2019-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多