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 函数不支持它(仅 rank
、dense_rank
和 row_num
).我不能使用触发器(在记录插入发生之前修改记录插入),因为我需要将上面提到的数据保存在本地临时 table 的存储函数中——并且 MonetDB 不支持触发器声明函数定义。
我还尝试通过将之前的 table(id
和 gap
)读入另一个临时 table( id
、gap
、groupID
),希望这会强制执行逐行操作。但这也失败了,因为它为所有记录提供了 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;
考虑以下 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 函数不支持它(仅 rank
、dense_rank
和 row_num
).我不能使用触发器(在记录插入发生之前修改记录插入),因为我需要将上面提到的数据保存在本地临时 table 的存储函数中——并且 MonetDB 不支持触发器声明函数定义。
我还尝试通过将之前的 table(id
和 gap
)读入另一个临时 table( id
、gap
、groupID
),希望这会强制执行逐行操作。但这也失败了,因为它为所有记录提供了 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;