我有下面的表格,其中有amount分可以收费或记入贷方.这些条目中的每一行都得到id分.现在,您可以通过给予完全相同的金额的信用并逆转该/来取消费用.如果是这样的话,reversed_by字段会告诉你哪一个id会翻转它.但你可以想反转多少次就逆转多少次.因此,例如,id 8fa22925从未被颠倒,并且应该单独在一个组中(4).4e35510ac362b6c5逆转,逆转停止,所以他们进入了3组.beca097bdc102220颠倒,但这反过来又被84529ee0颠倒.我知道idreversed_by以2列格式形成了一个简单的树 struct .

如何使用postgres将分组添加到所有连接,如下面所需的输出所示?

我不关心group是什么…可以是int、varchar、原始/最后的ID等.

图式

CREATE TABLE delete_me (
    amount Int,
    id varchar(255),
    reversed_by varchar(255)
);

INSERT INTO delete_me
VALUES
( 12,'ea75921c', NULL     ),
(-12,'e72d92d9','ea75921c'),
(-12,'84529ee0', NULL     ),
( 12,'dc102220','84529ee0'),
(-12,'beca097b','dc102220'),
(  8,'c362b6c5', NULL     ),
( -8,'4e35510a','c362b6c5'),
( 10,'8fa22925', NULL     )

Query #1

SELECT * FROM delete_me;
amount id reversed_by
12 ea75921c
-12 e72d92d9 ea75921c
-12 84529ee0
12 dc102220 84529ee0
-12 beca097b dc102220
8 c362b6c5
-8 4e35510a c362b6c5
10 8fa22925

Desired Output

amount id reversed_by group
12 ea75921c 1
-12 e72d92d9 ea75921c 1
-12 84529ee0 2
12 dc102220 84529ee0 2
-12 beca097b dc102220 2
8 c362b6c5 3
-8 4e35510a c362b6c5 3
10 8fa22925 4

View on DB Fiddle

推荐答案

用"倒向树"的根作为"组指标"又如何?

with recursive cte as (
  select dm.*, id as root, 1 as level
  from delete_me dm
  where dm.reversed_by is null
  union all
  select ch.*, cte.root, cte.level + 1
  from delete_me ch
    join cte on cte.id = ch.reversed_by
)
select *
from cte
order by root, level

这将根据您的示例数据返回以下结果:

amount | id       | reversed_by | root     | level
-------+----------+-------------+----------+------
   -12 | 84529ee0 |             | 84529ee0 |     1
    12 | dc102220 | 84529ee0    | 84529ee0 |     2
   -12 | beca097b | dc102220    | 84529ee0 |     3
    10 | 8fa22925 |             | 8fa22925 |     1
     8 | c362b6c5 |             | c362b6c5 |     1
    -8 | 4e35510a | c362b6c5    | c362b6c5 |     2
    12 | ea75921c |             | ea75921c |     1
   -12 | e72d92d9 | ea75921c    | ea75921c |     2

Online example

Sql相关问答推荐

获取每个帖子的匹配关键字列表

如何转换和汇总行数

如何退回当年的所有参赛作品?""

从以前的非空值行中获取值

更新在两个或多个面中具有交点的面

分组多输出访问查询问题

如何计算给定日期前三个月的值以及月初数据?

用另一个表中的特定名称替换 SQL 查询中的 ID.但我的两个表都有多个列

使用 SQL 将列添加到 Access 数据库时出错

统计重复记录的总数

计算 ID 满足条件的次数

如何在第二个 INSERT 中使用第一个 INSERT 自动生成的 ID

如何获取每个组中最近的n条记录并将它们聚合成数组

计数时如何为所有时间间隔返回 0 而不是什么都不返回

Teradata 多个进程的最大进程结束时间捕获

使用 SAVE TRANSACTION 时 BEGIN 和 COMMIT 语句的数量不匹配

Athena:从字符串birth_dt列计算年龄

从多个连接返回 1 行到同一个表 - SQL Server

如何在 Trino/Presto 中过滤掉 map 中的某些键?

遍历数据,计算每个月最后三天的总和