MonetDB:根据给定的 "boundary" 条件枚举行组

MonetDB: Enumerate groups of rows based on a given "boundary" condition

考虑以下 table:

id  gap  groupID
 0  0    1
 2  3    1
 3  7    2
 4  1    2
 5  5    2
 6  7    3
 7  3    3
 8  8    4
 9  2    4

其中 groupID 是所需的计算列,例如只要 gap 列大于阈值(在本例中为 6),它的值就会递增。 id 列定义了行出现的顺序(并且已经给出)。

你能帮我弄清楚如何为 groupID 动态填写适当的值吗?

我查看了 Whosebug 中的其他几个条目,并且看到了 sum 作为 window 函数的聚合的用法。我无法使用 sum,因为 MonetDB window 函数不支持它(仅 rankdense_rankrow_num).我不能使用触发器(在记录插入发生之前修改记录插入),因为我需要将上面提到的数据保存在本地临时 table 的存储函数中——并且 MonetDB 不支持触​​发器声明函数定义。

我还尝试通过将之前的 table(idgap)读入另一个临时 table( idgapgroupID),希望这会强制执行逐行操作。但这也失败了,因为它为所有记录提供了 groupID 0:

declare threshold int;
set threshold = 6;
insert into newTable( id, gap, groupID )
        select A.id, A.gap, 
            case when A.gap > threshold then 
                (select case when max(groupID) is null then 0 else max(groupID)+1 end from newTable) 
            else 
                (select case when max(groupID) is null then 0 else max(groupID) end from newTable) 
            end
        from A
        order by A.id asc;

非常感谢任何帮助、提示或参考。已经花了很长时间试图弄清楚这一点。

顺便说一句:MonetDB 也不支持游标 --

您可以使用相关子查询分配组。简单统计一下前面值超过6的个数:

select id, gap,
       (select 1 + count(*)
        from t as t2
        where t2.id <= t.id and t2.gap > 6
       ) as Groupid
from t;