Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何选择配置单元分区中每列的最后一个非空值_Sql_Hive_Partition_Windowing - Fatal编程技术网

Sql 如何选择配置单元分区中每列的最后一个非空值

Sql 如何选择配置单元分区中每列的最后一个非空值,sql,hive,partition,windowing,Sql,Hive,Partition,Windowing,我有一个配置单元表,其中包含以下形式的事务数据(高度简化) 对于我的用例,我需要一个输出表,其中包含唯一的id,当按时间戳排序时,列条目是该特定id在该列中的最后一个非空值 因此,期望输出为: id Status Value UpdatedTimeStamp 515 Closed 1 2014-05-10T11:43:27 516 Closed NULL 2014-05-09T11:43:27 517 Open NULL 2014-05-09T11:43:27

我有一个配置单元表,其中包含以下形式的事务数据(高度简化)

对于我的用例,我需要一个输出表,其中包含唯一的id,当按时间戳排序时,列条目是该特定id在该列中的最后一个非空值

因此,期望输出为:

id  Status  Value   UpdatedTimeStamp

515 Closed  1   2014-05-10T11:43:27
516 Closed  NULL    2014-05-09T11:43:27
517 Open    NULL    2014-05-09T11:43:27
我试图通过在分区上使用窗口功能来实现这一点

INSERT OVERWRITE TABLE testSample2 SELECT id, FIRST_VALUE (Status) OVER SortedData, FIRST_VALUE (Value IGNORE NULLS) OVER SortedData, FIRST_VALUE (UpdatedTimeStamp) OVER SortedData FROM testSample WINDOW SortedData (PARTITION BY id ORDER BY UpdatedTimeStamp DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING);

这给了我NullPointerException(可能,Hive中还不支持忽略NULLS)。请建议我如何获取最后一个非空值。

尝试使用以下方法:

select ss.vl1, FIRST_VALUE(ss.ky) OVER (PARTITION BY ss.vl1 ORDER BY ss.nl, ss.vl rows unbounded preceding) 
FROM (
    SELECT IF(s.vl=123456, 'sasa', 'AAAAAA') as vl1, s.vl, s.ky, IF(s.ky IS NULL, 1, 0) as nl
    FROM (
        select explode(map(NULL, 123, 1, 1234, 2, 12345, 3, 123456)) as (ky, vl) from default.dual) s ) ss;
vl1     _wcol0
AAAAAA  1
AAAAAA  1
AAAAAA  1
sasa    3

如果您针对每个id选择“最后一个非空”值,那么为什么期望结果中会有
NULL
值?如果特定查询没有非空值,则会有空值。您所说的与“每个id的最后一个值”不同。如果最后一个值为空,则为“最后一个值”因为那个id是空的,对吗?但我希望该值是最后一个非空值。例如,对于id=515,列“value”的最后一个值为NULL,但在我更新的表中,“value”列为1。
select ss.vl1, FIRST_VALUE(ss.ky) OVER (PARTITION BY ss.vl1 ORDER BY ss.nl, ss.vl rows unbounded preceding) 
FROM (
    SELECT IF(s.vl=123456, 'sasa', 'AAAAAA') as vl1, s.vl, s.ky, IF(s.ky IS NULL, 1, 0) as nl
    FROM (
        select explode(map(NULL, 123, 1, 1234, 2, 12345, 3, 123456)) as (ky, vl) from default.dual) s ) ss;
vl1     _wcol0
AAAAAA  1
AAAAAA  1
AAAAAA  1
sasa    3