如何随机化3列中的数据顺序

时间:2009-08-20 17:10:52

标签: sql sql-server

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

LASTNAME 名字 CITY

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

4 个答案:

答案 0 :(得分:2)

当您说“重新订购”这些列时,您的意思是您希望某些姓氏最终位于第一个名称列中吗?或者,您是否希望将某些姓​​氏与不同的名字和城市相关联?

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

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

根据您使用的DBMS,这可能仅适用于一行,可能使所有姓氏相同,或者可能需要一些语法变体才能工作,但基本方法是正确的。当然,在对真实物体进行试验之前,有必要对该表的副本进行一些试验。

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

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

在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

答案 3 :(得分:-1)

select *, rand() from table order by rand();

我知道某些版本的SQL有一个rand(),每行都不会改变。检查你的。适用于MySQL。