Обновлять записи таблицы случайным образом на SQL сервере - PullRequest
0 голосов
/ 09 марта 2020

Я бы хотел изменить порядок записей в таблице случайным образом. Является ли это возможным? Я использую SQL Server 2016.

Example:
From that:
[UID] [Name]
54     Name1
24     Name5
8      Name6
50     Name7
19     Name10

to like that: (randomly)
[UID] [Name]
50     Name7
8      Name6
19     Name10
54     Name1
24     Name5

Примечание: это два столбца

Не нужно заменять 100% записей, иногда может повторяться один и тот же порядок как лотерея. Мне просто нужно смешать их.

Ответы [ 4 ]

5 голосов
/ 09 марта 2020

Я бы хотел изменить порядок записей в таблице случайным образом. Является ли это возможным?

Нет, это невозможно. SQL таблицы уже представляют неупорядоченные наборы. Там нет порядка, хотя вы можете определить столбцы, которые определяют порядок. Вы можете даже кластеризовать строки на основе значений столбцов, чтобы данные сохранялись по порядку. Это не означает, что он будет получен по порядку.

Что вы можете сделать - это рандомизировать при запросе. В SQL Сервер:

select t.*
from t
order by newid();
2 голосов
/ 09 марта 2020

SQL имеет Rand (), которая будет упорядочивать строки случайным образом

попробуйте этот запрос:

SELECT * FROM table_name ORDER BY RAND() LIMIT 5;
0 голосов
/ 09 марта 2020

Вы можете сделать это с помощью ROW_NUMBER() оконной функции следующим образом:

with 
  cte1 as (
    select *, row_number() over (order by newid()) rn
    from tablename
  ),
  cte2 as (
    select *, row_number() over (order by newid()) rn
    from tablename
  )
update c1 
set c1.name = c2.name, c1.UID = c2.UID
from cte1 c1 inner join cte2 c2
on c2.rn = c1.rn;

См. demo .

Но случайное чередование строк не имеет значения, потому что физический порядок строк не тот, о котором вы должны заботиться. Всегда используйте предложение ORDER BY при извлечении строк на основе существующих столбцов или определяйте новый столбец для этой цели.

0 голосов
/ 09 марта 2020

Один из подходов заключается в генерации двух последовательностей номеров строк, одна на основе фиксированного порядка, а другая случайная. Затем самостоятельно объедините свою таблицу в двух последовательностях и выполните случайное обновление столбца имени.

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY UID) rn,
        ROW_NUMBER() OVER (ORDER BY NEWID()) rn_rand
    FROM yourTable
)

UPDATE t1
SET t1.Name = t2.Name
FROM cte t1
INNER JOIN cte t2
    ON t1.rn = t2.rn_rand;
...