Заказ SQL Server по GroupID Случайный, но asc ID в каждом идентификаторе группы

Я использую SQL Server 2012.

Я хочу установить последовательные числа в поле Num каждый раз, когда я выполняю SQL с правилами следующим образом:

  • Grp для рандомизации.
  • Поле идентификатора, которое должно быть поднято.

Может ли кто-нибудь пролить свет на меня?

ТАБЛИЦА

+-----+-----+----+ | 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 | +-----+-----+----+ 

ТАБЛИЦА ОБРАЗЦОВ

 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 
  • Нажмите здесь, чтобы посмотреть результат
  • Обновление SQL с оператором CASE
  • Неправильный синтаксис около '('.?
  • Операция обновления с двумя разными каталогами
  • SQL Update Несколько полей FROM через инструкцию SELECT
  • Операция обновления для нескольких полей
  • SQL Server - таблица UPDATE, где ID находится в SELECT?
  • SQL Условный UPDATE На основе SELECT
  • Как обновить многие строки со случайными значениями
  • Производительность по запросу обновления / удаления
  • Проблемы с обновлением SQL при запуске сохраненного Proc
  • Ссылка на столбец и обновление его в том же самом заявлении
  • Interesting Posts

    Проблема создания пользователя в SqlServer с помощью smo

    Данные по дате в MSSQL

    Создание представления по дням недели с диапазоном списка дат

    Как добавить или изменить пространство имен Xml в SQL Server / Невозможно использовать «xmlns» в выражении имени

    Как установить значение переменной, используя 'execute' в t-sql?

    Обновление баз данных SQL Server

    Как интегрировать таблицы Identity ASP.NET в существующую базу данных

    Репликация базы данных сайта

    Вычисление Avg в SQL, исключая текущую строку

    Пользовательский столбец SQL из другого значения столбца запроса

    Стратегия запуска тестов в базе данных

    Преобразование Varchar 3 в int

    Возврат результата из запроса выбора в хранимой процедуре в список

    База данных Visual Studio SQL, произошла ошибка во время выполнения партии (Msg 1785)

    Получение неверного синтаксиса объединения при объединении двух результатов из одной таблицы

    Давайте будем гением компьютера.