首页 > 解决方案 > Vertica NEXTVAL() 函数 - 如何按条件在记录级别调用它?

问题描述

我正在使用 Vertica 分析数据库 v9.2.1-20,

并尝试使用NEXTVAL()函数在记录级别按条件获取下一个序列值。

这是示例

CREATE SEQUENCE v_seq START 1;

CREATE TABLE test_seq (id INT, flag int);
INSERT INTO test_seq VALUES (1, 0);
INSERT INTO test_seq VALUES (2, 1);
INSERT INTO test_seq VALUES (3, 1);
INSERT INTO test_seq VALUES (4, 0);
INSERT INTO test_seq VALUES (5, 0);
INSERT INTO test_seq VALUES (6, 1);
INSERT INTO test_seq VALUES (7, 1);

SELECT  id,
        flag,
        CASE 
           WHEN flag = 0 THEN NEXTVAL('v_seq') 
           ELSE CURRVAL('v_seq') 
        END as group_id
  FROM test_seq 
ORDER BY ID;

预期结果:

id  flag    group_id
1   0       1
2   1       1
3   1       1
4   0       2
5   0       3
6   1       3
7   1       3

实际结果:

id  flag    group_id
1   0       1
2   1       2
3   1       3
4   0       4
5   0       5
6   1       6
7   1       7

无论 WHEN 条件如何,似乎都在调用 NEXTVAL() 函数。

有没有办法通过条件调用它?

谢谢!

标签: sequencevertica

解决方案


我的几个测试 - 在 Vertica 10 中 - 导致您在上面报告的相同行为。

似乎没有办法让它做你想做的事。

如其他地方所述,您可以使用它CONDITIONAL_TRUE_EVENT(flag=0) OVER(ORDER BY id)来获得您想要的结果。

存在变慢的风险,因为您的 OLAP 窗口规范中没有 PARTITION BY,因此在大表的情况下运行单线程。

但是一个大表会被分割。

在带有 的分段表中,表的seq.nextval每个部分/段将以不同倍数(默认为 250,000)开始您使用的序列。在节点1中,序列从1开始,在节点2中,序列从250,000开始,在节点3中从500,000开始,等等。如果表不分段,序列生成器也会导致单线程进程,从而惩罚你的表现。所以你不知何故介于岩石和坚硬的地方之间......

如果表是分段的,您可以并行化 CONDITIONAL_TRUE_EVENT() 调用,方法是将基表的分段标准用作 OLAP 函数调用中的 PARTITION BY 标准。


推荐阅读