Как добавить добавочный номер к каждому элементу в сгруппированной серии?
Я столкнулся с проблемой, когда у меня есть стол с именем 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