2014-11-25 2 views
3

Мне были предоставлены некоторые данные в электронной таблице, которые вскоре будут внедрены в автоматизированный импорт, поэтому я не могу выполнить ручную запись в электронной таблице. Данные в основном имеют следующие столбцы. Trayid, trayname, itemdescription и rownumber. Я сам не собирал эти таблицы, иначе я бы построил их по-другому, но я должен придерживаться формата, который уже установлен.Обновление строк на основе rownumber в SQL Server 2012

Данные, которые импортируются, будут выглядеть следующим образом.

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 

Что мне нужно сделать, это обновить trayid и trayname для каждого из остальных строк следующих строк 1, так, например, он будет выглядеть.

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 

Im угадывание мне нужно использовать curser или что-то, но я не уверен, я думаю, что это может быть сделано путем идти вниз rownumbers и останавливается, когда он Престола ROWNUMBER 1 раз, а затем продолжая со следующей trayid и trayname.

Извините, если то, что мне нужно, не имеет смысла, было неудобно объяснять.

ответ

1

Таблицы SQL не имеют встроенного порядка. Поэтому вы не можете зависеть от этого. Но есть что-то, что вы можете сделать:

  • Определите столбец identity в исходной таблице.
  • Создайте представление об исходной таблице, которая исключает личность.
  • Массовая вставка на вид.

Это будет присвоить порядковый номер рядам в том же порядке, что и исходные данные. Назовем это 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()), и эти значения используются для обновления.

Смежные вопросы