Заказ SQL Server по GroupID Случайный, но asc ID в каждом идентификаторе группы
Я использую SQL Server 2012.
Я хочу установить последовательные числа в поле Num каждый раз, когда я выполняю SQL с правилами следующим образом:
- Grp для рандомизации.
- Поле идентификатора, которое должно быть поднято.
Может ли кто-нибудь пролить свет на меня?
- Обновить столбец XML с узлами из другого XML на SQL Server
- Обновление нефиксированных данных в ячейке с помощью оператора UPDATE
- Использование IIF в операторе обновления SQL
- Не удается запустить инструкцию SQL update в vb.net,
- SQL - (обновление, From) с внутренним соединением в одной таблице
ТАБЛИЦА
+-----+-----+----+ | Num | Grp | ID | +-----+-----+----+ | 0 | 1 | 1 | | 0 | 1 | 2 | | 0 | 1 | 3 | | 0 | 2 | 4 | | 0 | 2 | 5 | | 0 | 2 | 6 | | 0 | 2 | 7 | | 0 | 3 | 8 | | 0 | 3 | 9 | | 0 | 4 | 10 | | 0 | 4 | 11 | | 0 | 4 | 12 | | 0 | 4 | 13 | | 0 | 4 | 14 | +-----+-----+----+
ОЖИДАЕМЫЙ ВЫХОД
+-----+-----+----+ | Num | Grp | ID | +-----+-----+----+ | 1 | 3 | 8 | | 2 | 3 | 9 | | 3 | 1 | 1 | | 4 | 1 | 2 | | 5 | 1 | 3 | | 6 | 4 | 10 | | 7 | 4 | 11 | | 8 | 4 | 12 | | 9 | 4 | 13 | | 10 | 4 | 14 | | 11 | 2 | 4 | | 12 | 2 | 5 | | 13 | 2 | 6 | | 14 | 2 | 7 | +-----+-----+----+
- SQL Server: рекурсивный оператор обновления
- SQL Server: инструкция UPDATE, где запрос MAX
- sql server UPDATE в сочетании с INNER JOIN с собой
- SQL вставленные - удаленные таблицы
- SQL Server: лучшая практика для обновления сразу нескольких строк с разными идентификаторами
- Обновление таблицы с ближайшим значением из матрицы поиска
- Получить идентификатор последней обновленной строки в SQL Server
- Как обновить строку с проверкой NULL в SQL?
ТАБЛИЦА ОБРАЗЦОВ
CREATE TABLE #TEMP(Num INT, Grp INT, ID INT) INSERT INTO #TEMP SELECT 0 , 1 , 1 UNION ALL SELECT 0 , 1 , 2 UNION ALL SELECT 0 , 1 , 3 UNION ALL SELECT 0 , 2 , 4 UNION ALL SELECT 0 , 2 , 5 UNION ALL SELECT 0 , 2 , 6 UNION ALL SELECT 0 , 2 , 7 UNION ALL SELECT 0 , 3 , 8 UNION ALL SELECT 0 , 3 , 9 UNION ALL SELECT 0 , 4 , 10 UNION ALL SELECT 0 , 4 , 11 UNION ALL SELECT 0 , 4 , 12 UNION ALL SELECT 0 , 4 , 13 UNION ALL SELECT 0 , 4 , 14
QUERY
;WITH CTE2 AS ( -- Now GRP will be ordered in random order using NEWID() SELECT ROW_NUMBER() OVER(ORDER BY NEWID()) RNO,GRP FROM ( -- Select unique GRP's SELECT DISTINCT GRP FROM #TEMP )TAB ) SELECT ROW_NUMBER() OVER(ORDER BY rno,ID ASC) NUM, C2.GRP,C1.ID FROM CTE2 C2 JOIN #TEMP C1 ON C2.GRP=C1.GRP order by rno,ID ASC
- Нажмите здесь, чтобы посмотреть результат
ОБНОВИТЬ
Ниже приведен запрос об обновлении поля NUM
в таблице с новыми номерами строк.
;WITH CTE2 AS ( SELECT ROW_NUMBER() OVER(ORDER BY NEWID()) RNO,GRP FROM ( SELECT DISTINCT GRP FROM #TEMP )TAB ) UPDATE #TEMP SET NUM = TAB.NUM FROM ( SELECT ROW_NUMBER() OVER(ORDER BY rno,ID ASC) NUM, C2.GRP,C1.ID FROM CTE2 C2 JOIN #TEMP C1 ON C2.GRP=C1.GRP )TAB WHERE #TEMP.GRP=TAB.GRP AND #TEMP.ID=TAB.ID SELECT * FROM #TEMP order by NUM,ID ASC
- Нажмите здесь, чтобы посмотреть результат