2014-09-17 5 views
2

У меня есть улей-таблица, содержащая данные о транзакциях вида (сильно упрощены)Как выбрать последние NON-NULL значения каждого столбца в улей раздела

id Status Value UpdatedTimeStamp 

515 Open 1 2014-05-08T11:43:27 
516 Open NULL 2014-05-08T11:43:27 
515 Answered 1 2014-05-09T11:43:27 
515 Closed NULL 2014-05-10T11:43:27 
517 Open NULL 2014-05-09T11:43:27 
516 Closed NULL 2014-05-09T11:43:27 

Для моего потребительной случае, мне нужно выводимая таблица, содержащая уникальные идентификаторы с номерами столбцов в качестве последнего значения, отличного от NULL, в этом столбце для этого конкретного идентификатора при сортировке по метке времени.

Таким образом, желаемый результат:

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 (Возможно, ИГНОРИРУЙТЕ NULLS пока не поддерживается в улье). Пожалуйста, предложите мне, как взять последнее значение, отличное от NULL.

+1

Если вы выбираете «последний Non-NULL» значение по отношению к каждому идентификатору, то почему есть 'значения NULL' в вашем желаемого результата? – gobrewers14

+0

есть значения NULL, если для определенного queryID нет значения, отличного от NULL. – Prashasti

+0

Как вы говорите иначе, чем «Последняя величина для каждого идентификатора». ? – gobrewers14

ответ

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