【问题标题】: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%的记录,它有时可以像彩票一样重复相同的顺序。我只需要混合它们。

【问题讨论】:

  • 虽然 Gordon 的回答是正确的,但这似乎是一个XY Problem。本活动旨在解决什么问题?

标签: 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 子句,或为此目的定义一个新列。

      【讨论】:

        猜你喜欢
        • 2021-04-15
        • 1970-01-01
        • 2011-04-03
        • 2020-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多