Sql 第一个值()中出现意外行为,忽略空值(Vertica)
我在Vertica的第一个带有IGNORE NULLS参数的_值分析函数中看到了意想不到的行为。当它不应该返回NULL时,它似乎返回NULL 问题出现在这个非常小的表中:Sql 第一个值()中出现意外行为,忽略空值(Vertica),sql,vertica,Sql,Vertica,我在Vertica的第一个带有IGNORE NULLS参数的_值分析函数中看到了意想不到的行为。当它不应该返回NULL时,它似乎返回NULL 问题出现在这个非常小的表中: drop table if exists temp; create table temp (time_ timestamp(6), name varchar(10)); insert into temp (time_) values ('2016-03-18 20:32:16.144'); insert into temp (
drop table if exists temp;
create table temp (time_ timestamp(6), name varchar(10));
insert into temp (time_) values ('2016-03-18 20:32:16.144');
insert into temp (time_, name) values ('2016-03-18 20:52:09.062', 'abc');
以下是表格select*from temp的内容:
time_ | name
------------------------+--------
2016-03-18 20:32:16.144 | <null>
2016-03-18 20:52:09.062 | abc
以下是此查询返回的结果:
time_ | first_name
------------------------+------------
2016-03-18 20:32:16.144 | <null>
2016-03-18 20:52:09.062 | abc
上面的查询是否有一个非常基本的语法错误?这个问题出现在Vertica Community Edition 7.1.1上。这就是我的想法
select time_
,first_value(name) over (order by case when name is null then 1 else 0 end,time_) FirstName
from temp A
order by time_
返回
time_ FirstName
20:32:16.1440000 abc
20:52:09.0620000 abc
该函数按预期工作。 over order by time_uu是over order by time_uuRange unbounded Previous的快捷方式,它是unbounded Previous和current row之间over order by time_uuRange的快捷方式,这意味着每一行只能看到它前面的行,包括它自己。 第一行只看到它自己,因此它的作用域中没有非NULL值 如果需要整个范围的第一个非空值,则必须指定整个范围:
first_value(name ignore nulls) over
(order by time_ range between unbounded preceding and unbounded following) first_name
不,这绝对不是一个bug
您可能一直在使用sumx over order by y这样的语法来运行总计,前面的RANGE UNBOUNDED默认窗口对您来说似乎非常自然。
由于没有为第一个_值函数定义显式窗口,因此一直使用相同的默认窗口
下面是另一个测试用例:
ts val
-- ----
1 NULL
2 X
3 NULL
4 Y
5 NULL
您希望从以下函数中得到什么
last_value (val) order (by ts)
您希望从以下函数中得到什么
last_value (val ignore nulls) order (by ts)
谢谢你的解决方案。在Vertica CE 7.1.1中,这种确切的语法不起作用,但您可以这样做:当名称为null时,按大小写选择时间、第一个值名称,然后按大小写选择1其他0结束、时间、第一个值名称和临时名称。但不应该忽略空值来做这件事吗?@Verbatros很高兴你能调整。震惊于它不支持IIF@verbatross搜索。。。但到目前为止,我在中只看到忽略空值AWS@JohnCappelletti,Oracle,Teradata,MySql,PostgreSQL,SQLite只是一些不支持非标准IIF的数据库,这些非标准IIF提供了标准CASE语句中已经包含的功能。如果发现有人支持它,那将更令人震惊。另请注意Oracle和Teradata支持NULLS@DuduMarkovitz后来我看到。。。我看了SQL并开始自动驾驶。非常有趣。对我来说,与其说是一个功能,不如说是一个bug,但我很高兴知道整个故事。非常感谢。谢谢你提供更多的例子!非常有用。
last_value (val) order (by ts)
last_value (val ignore nulls) order (by ts)