sequence - 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() 函数。
有没有办法通过条件调用它?
谢谢!
解决方案
我的几个测试 - 在 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 标准。
推荐阅读
- java - 运行 jasmin assembler 以获取 .class 文件并将其转换为 java
- c# - 基于列表视图项(xamarin 表单)隐藏视图单元格上下文操作菜单项
- python - 如何通过python电报机器人库在固定时间或间隔时间从机器人向用户发送消息?
- c++ - 字符串数组中的二分查找
- powerbi - 前一周测量 - 2019 年第 52 周和 2020 年第 1 周
- windows - 退出命令而不等待完成
- android - 当后退按钮按下销毁应用程序时,Flutter Android Platform EventChannel 不会停止
- laravel - Laravel (hasManyThrough eloquent 关系) - WhereHas 与 OrderBy 在本地主机上工作,而不是在服务器上工作
- reactjs - 删除了“transitionConfig”以支持新的动画 API
- angular - 查看子组件未定义