Как добавить добавочный номер к каждому элементу в сгруппированной серии?

Я столкнулся с проблемой, когда у меня есть стол с именем Group и стол называется Entry, Group таблица имеет первичный ключ Id, Entry таблица имеет первичный ключ Idвнешний ключ к Group таблицы Id называется GroupId, Entry таблица имеет еще один столбец Weight, это Weight является целым числом, и все, что он делает, это говорит мне вес сортировки, где ноль отображается вверху.

В основном, что случилось, кто-то сделал это Weight Обнуляемое поле, когда база данных была разработана. Теперь мне нужно пройти и настроить Weight чтобы соответствовать UNIQUE ограничение мы намерены добавить: UNQIUE(GroupId, Weight) к Entry Таблица. Это мешает двум Entry записи с одинаковым весом сортировки, когда они в основном находятся в одной группе.

Какой запрос позволил бы мне пройти через все наши существующие данные и просто пронумеровать Weight столбец для каждой из записей по группам от 0 до N, где N - это число Entry записи в Group? Я хочу установить вес на основе Id из Entry так что самый низкий Id для Entry в данном Group получает самый низкий Weight,

Я хочу один большой старый запрос, который пройдет через Group стол, объедините все Entry записи, а затем перебрать их и назначить последовательность. Но я понятия не имею, с чего начать.

1 ответ

Решение

По сути, вы будете использовать MS SQL Over Clause

Вот пример sqlfiddle, чтобы показать вам, как это сделать в одном запросе

Надеюсь это поможет.

CREATE TABLE Entry (Id INT PRIMARY KEY, GroupId INT, Weight INT);

CREATE TABLE [Group] (Id INT PRIMARY KEY, Label VARCHAR(10));

INSERT [Group] (Id, Label)
VALUES(1, 'test');


INSERT Entry (Id, GroupId, Weight)
VALUES(1,1, null)

INSERT Entry (Id, GroupId, Weight)
VALUES(2,1, null)

INSERT Entry (Id, GroupId, Weight)
VALUES(3,1, null)

UPDATE E
  SET E.WEIGHT = o.WEIGHTIS
--SELECT *
FROM Entry E
INNER JOIN (
    SELECT G.Id GID, E.Id EID, 
     ROW_NUMBER() OVER(PARTITION BY G.Id ORDER BY E.ID) WeightIs
    FROM [Group] G
    INNER JOIN Entry E
      ON G.Id = E.GroupId  
) o
ON o.GID = E.GroupID AND o.EID = E.Id
Другие вопросы по тегам