SQL-запрос для заполнения поля индекса на основе групп - PullRequest
2 голосов
/ 22 сентября 2010

Я довольно новичок в SQL и надеялся, что кто-нибудь может помочь мне с запросом на обновление.У меня есть таблица пользователей со столбцами group_id (внешний ключ), user_id и user_index.Каждому отдельному group_id соответствует несколько пользователей, а user_id - это последовательный столбец, который идет от 1 до размера таблицы.

Я ищу запрос, который обновит столбец user_index, чтобы для каждого group_idкаждый пользователь будет иметь уникальный последовательный индекс, начинающийся с 1. Таким образом, в группе 1 будет user_index 1,2,3 ... и в группе 2 будет user_index 1,2,3 ... и так далее.Вот пример для пояснения:

Исходное состояние:

user_id | group_id | user_index
1         1          0
2         1          0
3         1          0
4         2          0
5         3          0
6         3          0

Желаемое состояние:

user_id | group_id | user_index
1         1          1
2         1          2
3         1          3
4         2          1
5         3          1
6         3          2

Надеюсь, это понятно.Это было бы легко сделать в C или C ++, но мне интересно, есть ли способ сделать это в SQL.

1 Ответ

2 голосов
/ 22 сентября 2010
UPDATE TableName
SET user_index = (SELECT COUNT(1) FROM TableName t2 
   WHERE t2.group_id = TableName.group_id AND t2.user_id <= TableName.user_id)

РЕДАКТИРОВАТЬ:
После просмотра комментария автора я создал тест, чтобы увидеть, является ли это правильным решением.Вот тест:

CREATE TABLE #table (user_id int, group_id int, user_index int)

INSERT INTO #table VALUES (1, 1, 0)
INSERT INTO #table VALUES (2, 1, 0)
INSERT INTO #table VALUES (3, 1, 0)
INSERT INTO #table VALUES (4, 2, 0)
INSERT INTO #table VALUES (5, 3, 0)
INSERT INTO #table VALUES (6, 3, 0)

SELECT * FROM #table

UPDATE #table
SET user_index = (SELECT COUNT(1) FROM #table t2 
WHERE t2.group_id = #table.group_id AND t2.user_id <= #table.user_id)

SELECT * FROM #table

DROP TABLE #table

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...