【问题标题】:Update table records randomly in SQL Server在 SQL Server 中随机更新表记录
【发布时间】:2020-03-09 17:23:09
【问题描述】:
我想随机更改表格中记录的顺序。是否可以?我正在使用 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%的记录,它有时可以像彩票一样重复相同的顺序。我只需要混合它们。
【问题讨论】:
标签:
sql
sql-server
sql-server-2016
【解决方案1】:
我想随机更改表格中记录的顺序。是否可以?
不,这是不可能的。 SQL 表已经代表 无序 集。没有排序,尽管您可以定义指定排序的列。您甚至可以根据列值对行进行聚类,以便按顺序存储数据。这并不意味着它会按顺序检索。
您可以做的是在查询时随机化。在 SQL Server 中:
select t.*
from t
order by newid();
【解决方案2】:
SQL 有 Rand(),它会以随机方式对行进行排序
试试这个查询:
SELECT * FROM table_name ORDER BY RAND() LIMIT 5;
【解决方案3】:
一种方法是生成两个行号序列,一个基于固定顺序,另一个随机。然后,在两个序列上自行加入您的表并随机更新名称列。
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;
【解决方案4】:
你可以像这样使用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 子句,或为此目的定义一个新列。