2015-01-30 9 views
0

У меня есть таблица вроде этого:SQL: Обновление SortIndex на основе других столбцов

StepId | VehicleId| Description | SortIndex 
--------------------------- 
1  |xxx  | Description1 | 0 
2  |yyyyy  | Description2 | 0 
3  |yyyyy  | Description3 | 0 

Так что может быть от 0 до п шагов для одного транспортного средства (на который ссылается vehicleId). До сих пор я заказал шаги в колонке описания. Теперь я хотел бы обновить столбец SortIndex, чтобы они имели значения, как если бы я их упорядочил по колонке описания. Итак, для примера выше я хотел бы иметь:

StepId | VehicleId| Description | SortIndex 
    --------------------------- 
    1  |xxx  | Description1 | 1 
    2  |yyyyy  | Description2 | 1 
    3  |yyyyy  | Description3 | 2 

Есть ли какая-либо SQL-магия, которую я могу сделать, чтобы достичь этого?

Благодаря

EDIT: Я использую SQL Server, возможно, курсор будет делать работу

+0

Вы используете сервер sql? – DeadlyJesus

+0

Как вы хотите заказать по колонке описания? Численно или буквенно-цифровым способом? На данный момент вы сортируете таким образом: 'Описание19, Description2' –

+0

Как вы получили sortIndex? – SMA

ответ

0

Поскольку вы на SQL Server, вы можете использовать следующий запрос, который использует ранжирование функции:

SELECT StepId, VehicleId, Description, ROW_NUMBER() OVER (PARTITION BY VehicleId ORDER BY Description) as SortIndex 
FROM #Vehicle 

row_number() будет генерировать номер для каждой строки на основе его порядка при сортировке по Description в его VehicleId группы.

0

Самый простой способ (на мой взгляд) использовать обновляемый КТР с оконными функциями:

with toupdate as (
     select t.*, 
      row_number() over (partition by vehicleId order by Description) as NewSortIndex 
     from likethat 
    ) 
update toupdate 
    set SortIndex = NewSortIndex; 

Если вы действительно не хотите update но только возвращать результаты, просто использовать запрос в CTE.

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