我有一张桌子

CREATE TABLE test_tbl(id integer, num integer, name text);

数据在哪里

INSERT INTO test_tbl (id, num, name)
VALUES(1, 2000, 'fdghgf'),(2, 3000, 'fdghg'),(3, 400, 'fhgf'),(4, 2200, 'dhgf');

我想将此数据插入到另一个表tbl_diburaction中

CREATE TABLE tbl_bifuraction(id integer, num integer, name text, is_bifurcated integer);

因此,当金额大于1000时,它会插入多个包含1000和剩余金额的行(当剩余金额为0时没有额外的行).

插入的数据集应类似于:

id  num  name   is_bifurcated
1   1000 fdghgf 1
1   1000 fdghgf 1
2   1000 fdghg  1
2   1000 fdghg  1
2   1000 fdghg  1
3   400  fhgf   0
4   1000 dhgf   1
4   1000 dhgf   1
4   200  dhgf   1

bifuracted_query添加了小提琴链接

推荐答案

关键是使用generate_series()执行横向联接,这样您就可以获得所需的结果行数:

SELECT t.id,
       CASE WHEN (g.c + 1) * 1000 > t.num
            THEN t.num - g.c * 1000
            ELSE 1000
       END AS num,
       t.name,
       CAST(t.num > 1000 AS integer) AS is_bifurcated
FROM test_tbl AS t
   CROSS JOIN LATERAL generate_series(0, (num - 1) / 1000) AS g(c);

 id │ num  │  name  │ is_bifurcated 
════╪══════╪════════╪═══════════════
  1 │ 1000 │ fdghgf │             1
  1 │ 1000 │ fdghgf │             1
  2 │ 1000 │ fdghg  │             1
  2 │ 1000 │ fdghg  │             1
  2 │ 1000 │ fdghg  │             1
  3 │  400 │ fhgf   │             0
  4 │ 1000 │ dhgf   │             1
  4 │ 1000 │ dhgf   │             1
  4 │  200 │ dhgf   │             1
(9 rows)

Sql相关问答推荐

在SQL Server中使用LEFT连接包含特定记录

PostgreSQL中的合并命令是原子的,还是需要一些类似于SQL Server版本的内容?

返回找到的最小和最大row_number()spark SQL

在SQL中为两个日期之间的每个日期添加行

重用传递给 node 的参数-postgres upsert查询

Postgres SQL查询从字符串中获取邮箱地址

提取连续时间戳范围的SQL

Select 最频繁的值以及分组依据

通过UPDATE SELECT更新表时出现问题

STContains、STIntersections和STWithin返回错误的地理结果

输出连续出现两次以上的行

Postgresql - WHERE 中的 MAX 标准 - 初学者问题

如何使用 Google BigQuery 中的条件根据特定列值连接列的 N 行?

BigQuery导航函数计算ID

一次 Select 语句中按组累计的SQL累计数

基于字符串的SQL查询

自动生成计算频率的列

Select 给定类别列表(或更多类别)中的所有事物

多列上的 SQL UNIQUE 约束 - 它们的组合必须是唯一的还是至少其中之一?

SQL:获取连接表的第一个项目