В Sql Server 2008, как нумеровать поставки для каждого клиента

#sql #sql-server #sql-server-2008 #row-number

#sql #sql-server #sql-server-2008 #строка-номер

Вопрос:

У меня есть две таблицы: Клиент ——>> Отгрузка

Я хочу присвоить каждой отправке уникальный номер для каждого клиента, например

 CustomerID      ShipmentID       ShipmnetNumber
    10              50                  1
    10              51                  2
    10              55                  3

    15              56                  1
    15              57                  2
    15              58                  3

    17              59                  1
    17              60                  2
  

и т.д…

как я могу это сделать в sql server 2008

Комментарии:

1. Вы говорите о сохранении этого ShipmentNumber столбца? Если это так, на самом деле нет хорошего способа сделать это в SQL Server. Вставки должны определять текущий раздел Max и блокировать другие одновременные вставки в тот же раздел и т. Д.

2. Разве это не может быть сделано даже с помощью (With statement ) ???

3. Это можно сделать прямо как SELECT с ROW_NUMBER помощью, но ShipmentNumber со временем это не будет стабильным, если у вас когда-либо будут удаления. Пожалуйста, объясните, что вы пытаетесь сделать здесь (мотивация)

4. Хорошо, я собираюсь сохранить его, но как я могу это сделать?

5. Первоначальная настройка прямолинейна в соответствии с ответом Микаэля, но поддерживать ее в актуальном состоянии — это боль.

Ответ №1:

Чтобы получить нумерацию с помощью запроса, вы можете сделать это

 select CustomerID,
       ShipmentID,
       row_number() over(partition by Shipment.CustomerID  
                         order by ShipmentID) as ShipmentNumber
from Shipment
  

Если вы хотите обновить таблицу с помощью ShipmentNumber (недавно добавленный столбец), вы можете сделать это

 ;with S as
(
  select ShipmentNumber,
         row_number() over(partition by Shipment.CustomerID  
                           order by ShipmentID) as ShipNum
  from Shipment
)
update S
set ShipmentNumber = ShipNum