2009-08-20 44 views
2

我在SQL Server 2005数据的3列:如何随机数据的顺序在3列

LASTNAME FIRSTNAME CITY

我想随机重新排列这些3列(以及Munge时间的数据),这样数据就不再有意义了。是否有捷径可寻?我不想更改任何数据,我只是想随机重新排列索引。

+0

你的意思是姓,名,和城市将不再是在同一行? Doe,来自Lewiston的John可能最终成为来自奥本的Doe,William? – 2009-08-20 17:15:55

+0

一个'John Doe,Austin',一个'James Foe,Chicago'的朋友应该成为'Austin John,Doe'还是'James Doe,Chicago'? – Quassnoi 2009-08-20 17:29:40

回答

2

当你说“重新排序”这些列时,你的意思是你想要一些姓氏在名字列中结束吗?或者你的意思是说你想让一些姓氏与不同的名字和城市相关联?

我怀疑你的意思是后者,在这种情况下,你可能更容易找到一个编程解决方案(而不是直接的SQL解决方案)。与SQL坚持,你可以这样做:

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

取决于你所使用的数据库管理系统,这对于只有一条线的工作,可以使所有的姓氏相同,或者可能需要语法的某种变体一切工作,但基本的方法是正确的。当然,在对真品进行尝试之前,表格的拷贝上的一些试验是有保证的。

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

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

最后,如果您只需要每列中的一个随机值,就可以在没有制作数据副本的情况下进行适当的处​​理,并有三个单独的查询:一个选择随机名,一个随机姓,最后一个随机电话号码。

+0

+1“你可能会发现一个编程解决方案更容易” – Kip 2009-08-20 19:41:56

+0

这个解决方案没有为MS SQL服务器工作 – djangofan 2009-09-03 18:27:47

+0

在SQL Server中,使用'NEWID()'而不是'RAND()'。我会用sql-server重申你的问题,以澄清你正在使用的东西。 – VoteyDisciple 2009-09-03 21:22:03

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

我了解SQL的某些版本中有一个RAND()不为每个行改变。检查你的。适用于MySQL。

+0

两件事。 1)我不认为这是他要求的; 2)'rand by()'有严重的性能问题:http://jan.kneschke。de/projects/mysql/order-by-rand/ – Kip 2009-08-20 17:27:51

+0

SQL Server使用NEWID()而不是RAND()。这个解决方案对我不起作用。 – djangofan 2009-09-03 18:32:57

+0

在我回答的时候,您的问题没有指定“SQL”以外的任何内容。它不到24小时前表示SQL Server。 – 2009-09-04 14:37:17

0

我建议使用newid的校验和做随机

SELECT LASTNAME, FIRSTNAME, CITY FROM table ORDER BY CHECKSUM(NEWID()) 
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