MonetDB:根据给定的"边界"枚举行组。条件

时间:2017-03-05 22:48:14

标签: sql grouping monetdb

考虑下表:

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的适当值吗?

我在StackOverflow中查看了其他几个条目,并且我已经看到sum用作窗口函数的聚合。我无法使用sum,因为 MonetDB 窗口函数(仅rankdense_rank和{{1})不支持})。我不能使用触发器(在记录插入发生之前修改它),因为我需要将上面提到的数据保存在本地临时表中的存储函数中 - 并且MonetDB函数定义中不支持触发器声明

我还尝试通过阅读上一个表格row_numgroupID)填写id列值到另一个临时表(gap,{{1} },id),希望这会强制逐行操作。但这也失败了,因为它为所有记录提供了gap 0

groupID

非常感谢任何帮助,提示或参考。很长一段时间以来我们都试图解决这个问题。

BTW:MonetDB不支持游标 -

1 个答案:

答案 0 :(得分:2)

您可以使用相关子查询分配组。只需计算超过6的先前值的数量:

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