【问题标题】:How to randomize order of data in 3 columns如何随机化 3 列中的数据顺序
【发布时间】:2009-08-20 17:10:51
【问题描述】:

我在 SQL Server 2005 中有 3 列数据:

姓氏 名 城市

我想随机重新排序这 3 列(并整理数据),以使数据不再有意义。是否有捷径可寻?我不想更改任何数据,我只想随机重新排序索引。

【问题讨论】:

  • 您的意思是姓氏、名字和城市将不再位于同一行吗?来自 Lewiston 的 Doe, John 最终可能会成为来自 Auburn 的 Doe, William?
  • 应该将一个John Doe, Austin,一个James Foe, Chicago 的朋友变成Austin John, DoeJames Doe, Chicago

标签: sql sql-server


【解决方案1】:

当您说“重新排序”这些列时,您的意思是您希望某些姓氏最终出现在名字列中吗?或者您的意思是您希望某些姓氏与不同的名和城市相关联?

我怀疑您的意思是后者,在这种情况下,您可能会发现编程解决方案更容易(而不是直接的 SQL 解决方案)。坚持使用 SQL,您可以执行以下操作:

UPDATE the_table
SET lastname = (SELECT lastname FROM the_table ORDER BY RAND())

根据您使用的 DBMS,这可能只适用于一行,可能使所有姓氏都相同,或者可能需要一些语法变化才能工作,但基本方法是正确的。当然,在对真实的东西进行尝试之前,必须先对桌子的副本进行一些试验。

当然,要让名字和城市也被随机重新排序,您可以对其中任一列应用类似的查询。 (将它应用于所有三个没有多大意义,但也不会受到伤害。)

由于您不想更改原始数据,您可以在填充了所有行的临时表中执行此操作。

最后,如果您只需要每列中的一个随机值,您可以在不复制数据的情况下就地完成,使用三个单独的查询:一个选择随机名字,一个随机姓氏,最后一个是随机电话号码。

【讨论】:

  • 在 SQL Server 中,使用 NEWID() 而不是 RAND()。我将用 sql-server 重新标记您的问题,以澄清您正在使用的内容。
【解决方案2】:

我建议使用带有校验和的 newid 进行随机化

 SELECT LASTNAME, FIRSTNAME, CITY FROM table ORDER BY CHECKSUM(NEWID())

【讨论】:

    【解决方案3】:

    在 SQL Server 2005+ 中,您可以准备一个排名行集,其中包含三个目标列和三个填充随机排名的附加计算列(三个目标列中的每一个列)。然后排名行集将使用排名列与自身连接三次,最后三个目标列中的每一个都将从他们自己的排名行集实例中提取。这是一个插图:

    WITH sampledata (FirstName, LastName, CityName) AS (
      SELECT 'John', 'Doe', 'Chicago' UNION ALL
      SELECT 'James', 'Foe', 'Austin' UNION ALL
      SELECT 'Django', 'Fan', 'Portland'
    ),
    ranked AS (
      SELECT
        *,
        FirstNameRank = ROW_NUMBER() OVER (ORDER BY NEWID()),
        LastNameRank  = ROW_NUMBER() OVER (ORDER BY NEWID()),
        CityNameRank  = ROW_NUMBER() OVER (ORDER BY NEWID())
      FROM sampledata
    )
    SELECT
      fnr.FirstName,
      lnr.LastName,
      cnr.CityName
    FROM ranked fnr
      INNER JOIN ranked lnr ON fnr.FirstNameRank = lnr.LastNameRank
      INNER JOIN ranked cnr ON fnr.FirstNameRank = cnr.CityNameRank
    

    这是结果:

    FirstName LastName CityName
    --------- -------- --------
    James     Fan      Chicago
    John      Doe      Portland
    Django    Foe      Austin
    

    【讨论】:

      【解决方案4】:
      select *, rand() from table order by rand();
      

      我了解某些 SQL 版本的 rand() 不会因每一行而改变。检查你的。适用于 MySQL。

      【讨论】:

      • 两件事。 1)我不认为这是他要求的; 2)order by rand()有严重的性能问题:jan.kneschke.de/projects/mysql/order-by-rand
      • SQL Server 使用 NEWID() 而不是 RAND() 。这个解决方案对我不起作用。
      • 在我回答时,您的问题没有指定除“SQL”以外的任何内容。它表示 SQL Server 不到 24 小时。
      猜你喜欢
      • 2016-01-24
      • 1970-01-01
      • 2012-02-17
      • 2013-02-04
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      相关资源
      最近更新 更多