Vertica NEXTVAL() 函数 - 如何按条件在记录级别调用它?

如何解决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

看起来 NEXTVAL() 函数正在被调用,而不管 WHEN 条件如何。

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

谢谢!

解决方法

我的几个测试 - 在 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 标准。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?