如何使行洗牌?

时间:2018-01-03 08:04:29

标签: sql postgresql

有一个超过10行的表,现在需要随机地随机播放所有行并在其上创建一个新表。任何想法?

使用select * from table order by random()似乎很慢。 原始表就像,目标列分为两部分:

+--------+------+--------+------+-----+--------+
| cst_id | name | salary | fund | age | target |
+--------+------+--------+------+-----+--------+
|      1 | a    |    100 | Y    |  33 |      0 |
|      2 | b    |    200 | Y    |  21 |      0 |
|      3 | c    |    300 | Y    |  45 |      0 |
|      4 | d    |    400 | N    |  26 |      0 |
|      5 | e    |    500 | N    |  37 |      0 |
|      6 | f    |    600 | Y    |  56 |      0 |
|      7 | g    |    700 | Y    |  44 |      0 |
|      8 | h    |    800 | N    |  22 |      1 |
|      9 | i    |    900 | N    |  38 |      1 |
|     10 | j    |   1000 | Y    |  61 |      1 |
|     11 | k    |   1100 | N    |  51 |      1 |
|     12 | l    |   1200 | N    |  21 |      1 |
|     13 | m    |   1300 | Y    |  32 |      1 |
|     14 | n    |   1400 | N    |  17 |      1 |
+--------+------+--------+------+-----+--------+

after:
+--------+------+--------+------+-----+--------+
| cst_id | name | salary | fund | age | target |
+--------+------+--------+------+-----+--------+
|      1 | a    |    100 | Y    |  33 |      0 |
|      2 | b    |    200 | Y    |  21 |      0 |
|      8 | h    |    800 | N    |  22 |      1 |
|      9 | i    |    900 | N    |  38 |      1 |
|      3 | c    |    300 | Y    |  45 |      0 |
|     13 | m    |   1300 | Y    |  32 |      1 |
|     14 | n    |   1400 | N    |  17 |      1 |
|      5 | e    |    500 | N    |  37 |      0 |
|      6 | f    |    600 | Y    |  56 |      0 |
|      7 | g    |    700 | Y    |  44 |      0 |
|     10 | j    |   1000 | Y    |  61 |      1 |
|     11 | k    |   1100 | N    |  51 |      1 |
|      4 | d    |    400 | N    |  26 |      0 |
+--------+------+--------+------+-----+--------+

1 个答案:

答案 0 :(得分:0)

以下说明是从现有的表创建新表,其中包含与洗牌行相同的数据(相同的模式)。

创建一个新表并从第一个表中导入所有这些行和记录,由RAND()SQL函数随机选择和排序:

CREATE TABLE new_table SELECT * FROM old_table ORDER BY RAND()

或者,如果您创建了一个与旧结构相同的表,请改用INSERT INTO:

INSERT INTO new_table SELECT * FROM old_table ORDER BY RAND()

当然,如果您想保留每一行的主键标识,那么由于遗留代码和数据实体关系,这很可能是您要对旧表执行的操作。但是,如果您希望一个包含所有洗牌记录的新旧表按顺序完全重新排列,就好像它是针对不同的应用程序一样,您可以通过不导入旧表的ID字段来忽略主键或ID。

例如,您在旧表中将ID,col1和col2作为数据字段。要创建旧表的新的重新排序或洗牌行版本:

CREATE TABLE new_table SELECT col1, col2 FROM old_table ORDER BY RAND()

新的主键ID将自动分配给新表中的每一行。

但在SQL中,关系没有秩序。关系数据库中的行未排序。检索时您可能会得到不同的订单。