当前位置: 首页 > 面试题库 >

FIRST_VALUE()中具有IGNORE NULLS的异常行为(Vertica)

壤驷德宇
2023-03-14
问题内容

我在带有IGNORE NULLS参数的Vertica的FIRST_VALUE()分析函数中看到意外的行为。它似乎不应该返回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 (time_, name) values ('2016-03-18 20:52:09.062', 'abc');

这是表的内容(从临时表中选择*):

time_                   | name
------------------------+--------
2016-03-18 20:32:16.144 | <null>
2016-03-18 20:52:09.062 | abc

这是我正在运行的查询:

select time_,
  first_value(name ignore nulls) over (order by time_) first_name
from temp;

以下是此查询返回的结果:

time_                   | first_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 | abc
2016-03-18 20:52:09.062 | abc

上面的查询是否有一个非常基本的语法错误?在Vertica Community Edition 7.1.1上会发生此问题。


问题答案:

该功能按预期方式工作。
over (order by time_)是的快捷方式,over (order by time_ range unbounded preceding)它是的快捷方式over (order by time_ range between unbounded preceding and current row),这意味着每一行都只能看到其前面的行,包括本身。
第一行仅显示自身,因此其范围内没有非NULL值。

如果要整个作用域的第一个非NULL值,则必须指定整个作用域:

first_value(name ignore nulls) over 
    (order by time_ range between unbounded preceding and unbounded following) first_name

不,这绝对不是错误。

您可能一直在使用诸如sum(x) over (order by y)运行总计之类的语法,而RANGE UNBOUNDED
PRECEDING的默认窗口对您来说似乎很自然。
由于尚未为FIRST_VALUE函数定义显式窗口,因此您一直在使用相同的默认窗口。

这是另一个测试用例:

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)


 类似资料:
  • 我正在尝试为我的项目导入一些gradle依赖项。但是,特定包正在生成NoClassDefFound异常。如果我没有理解错的话,发生这种情况是因为包是在编译时找到的,而不是在运行时找到的。我在下面包含了我的分级构建以及生成的错误。我曾尝试手动将所需的jar添加到WAR库文件中,但没有成功。 我尝试手动将所需的jar添加到WAR库文件中,但没有成功。

  • 问题内容: 我在sql server中创建了一个存储过程来馈送SSRS,以允许它接受多个值。我已经创建了它,当我在报表中使用它或在sql server中执行它时,出现以下错误消息。我有什么想念的吗?谢谢 这是我的示例数据。随时使用它创建表 这是我的动态存储过程代码 谢谢 错误的梅格 问题答案: 还有另一种方法可以做到这一点。为何不使用函数拆分参数,而不是将值传递给动态查询? 一旦选择了其中一个功能

  • 问题内容: 当运行上述代码片段时,在控制台中,我得到的输出为: 但我期望输出为 但是当在main()内部更改如下所述的逻辑时 我正在获得所需的输出 根据我的理解,TreeMap的entrySet()方法返回地图中包含的映射的集合视图。集合的迭代器以升序键顺序返回映射。那么,为什么在第一种情况下会发生这种情况? 任何建议都将受到高度赞赏。 问题答案: 因为在字典上小于。 这里有一个提示: 这是另一个

  • 如何处理要报告多个问题的文件上的多个异常。 我有一个多处理步骤的情况,其中不同的异常可以发生(例如,它们将在以后异步)。我使用(可能是快速失败的反模式)异常列表,然后一旦他们完成并检查异常 我有自己定制的异常类别(针对每个异步任务)(扩展类),但实现了一个接口,以包含消息特定的键值对等附加信息 示例实现 我的问题是,如果我知道我在每个任务中创建这些异常对象时会遇到什么问题,但我不会抛出它们。但如果

  • 假设我们的最大内存为256M,为什么这段代码可以工作: 但这一个会发出声音吗?

  • 这里有点小麻烦。我正在尝试编写一些代码来确定当前用户是否有:一个超过30天的帐户和0个woocommerce订单。我有这个顶部部分提取所有的订单属于用户在过去90天。 然而,它返回0个订单,即使我的测试用户有1个已完成的订单。我预感可能是这行:“before”=>date('y-m-d',strtotime('now'))所以我去掉了它,然后它返回“19个订单”,这简直是不可能的。print_r部