如何在postgresql中拆分表

时间:2017-12-20 07:59:15

标签: sql postgresql

我得到一个大约7万行的数据集,现在我想将这个表拆分为三个具有确切行数(代码是在SAS中应用的fisrt,现在转移到postgresql),一个来自1-5000,两个来自5001-25000,最后一个与其余行,其中任何一行都没有重复的行。 像:

+--------+-----+--------+-----+
| cst_id | age | salary | sex |
+--------+-----+--------+-----+
|      1 |  44 |   2000 | M   |
|      2 |  23 |   3000 | F   |
|      3 |  34 |   4000 | M   |
|      4 |  51 |   5000 | M   |
|      5 |  26 |   6000 | F   |
|      6 |  28 |   7000 | F   |
|      7 |  39 |   8000 | M   |
+--------+-----+--------+-----+

最后我想要三个表格,其中包含我指定的确切行数(例如3rows-2rows-rest rows),它们都是distinct.like: 表1:

+--------+-----+--------+-----+
| cst_id | age | salary | sex |
+--------+-----+--------+-----+
|      1 |  44 |   2000 | M   |
|      2 |  23 |   3000 | F   |
|      3 |  34 |   4000 | M   |
+--------+-----+--------+-----+

表2:

+--------+-----+--------+-----+
| cst_id | age | salary | sex |
+--------+-----+--------+-----+
|      4 |  51 |   5000 | M   |
|      5 |  26 |   6000 | F   |
+--------+-----+--------+-----+

表3:

 +--------+-----+--------+-----+
| cst_id | age | salary | sex |
+--------+-----+--------+-----+
|      6 |  28 |   7000 | F   |
|      7 |  39 |   8000 | M   |
+--------+-----+--------+-----+

如何使用postgresql来完成此操作?

2 个答案:

答案 0 :(得分:0)

您可以将此过程分解为一个功能步骤。

  1. 获取不同行的总数。
  2. 将该值除以3,并将该值存储为DECLARED变量(_size)。
  3. 创建table_1,table_2和table_3。
  4. 使用LIMIT(_size)INSERT INTO table_1。
  5. INSERT INTO table_2 with LIMIT(_size)WHERE id> table_1' s最大的身份。
  6. INSERT INTO table_3 with LIMIT(_size)WHERE id> table_2' s最大的身份。
  7. 希望这有帮助。

答案 1 :(得分:0)

有一个窗口函数“ NTILE”可以做到这一点:

-添加一个col来帮助拆分
将临时表help_table创建为
选择*
,NTILE(3)OVER(ORDER BY cat_id)as batch_nbr
从your_table;

创建表_1为 从help_table中选择*,其中batch_nbr = 1;

创建table_2为 从help_table中选择*,其中batch_nbr = 2;

创建table_3为 从help_table中选择*,其中batch_nbr = 3;