У меня есть таблица с 3 столбцами:HIVE эквивалент FIRST и LAST
table1: ID, CODE, RESULT, RESULT2, RESULT3
У меня есть этот код SAS:
data table1
set table1;
BY ID, CODE;
IF FIRST.CODE and RESULT='A' THEN OUTPUT;
ELSE IF LAST.CODE and RESULT NE 'A' THEN OUTPUT;
RUN;
Таким образом, мы группируя данные по ID и код, а затем записывая данные в набор данных, если выполняются определенные условия. Я хочу написать запрос на улей, чтобы воспроизвести это. Это то, что у меня есть:
proc sql;
create table temp as
select *, row_number() over (partition by ID, CODE) as rowNum
from table1;
create table temp2 as
select a.ID, a.CODE, a.RESULT, a.RESULT2, a.RESULT3
from temp a
inner join (select ID, CODE, max(rowNum) as maxRowNum
from temp
group by ID, CODE) b
on a.ID=b.ID and a.CODE=b.CODE
where (a.rowNum=1 and a.RESULT='A') or (a.rowNum=b.maxRowNum and a.RESULT NE 'A');
quit;
Есть два вопроса, которые я вижу с этим.
1) Строка, которая является первой или последней в каждой группе BY, полностью зависит от порядка строк в таблице 1 в SAS, мы ничего не заказываем. Я не думаю, что порядок строк сохраняется при переводе на запрос куста.
2) Код SAS занимает первую строку в каждой группе BY GROUP или последней, а не в обеих. Я думаю, что мой запрос HIVE принимает оба, в результате чего больше строк, чем я хочу.
Любые предложения или понимание того, как улучшить мой запрос, оценены. Возможно ли повторить этот код SAS в HIVE?
существует 'FIRST_VALUE()' и 'last_value()' функция в улье https: // cwiki.apache.org/confluence/display/Hive/LanguageManual+WindowingAndAnalytics – gobrewers14