2016-12-21 7 views
0

В настоящее время я пытаюсь извлечь эти значения из таблицы, которая не существует в другой таблице. Однако, поскольку значение объединения содержит нулевые значения - опция не в, а не в том и влево, как представляется, не работает.HiveQL эквивалент!> В SQL

Таким образом, существует ли способ применить условие «не больше» в HiveQL?

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

with date_prob as 
(
    select distinct visit 
    from t1 
    where dt=20161124 
    and dt1!=orig_ts 
), 

ev_data as 
(
    select distinct visit 
    from t1 
    where dt=20161124 
    and visit is not null 
    and origts is not null 
    and uid is not null 
), 

fin_data as 
(
    select x.visit 
    from ev_data x 
    where x.visit not in 
    (
     select distinct visit 
     from date_prob 
     and visit is not null 
    ) 
) 

Запрос, который я баллотировался на левое -

with date_prob as 
(
    select distinct id 
    from t1 
    where dt1='2016-11-24' 
    and dt1!=orig_ts 
    and (datediff(dt1,orig_ts) not in ('1','-1')) 
), 

ev_data as 
(
    select distinct id 
    from t1 
    where dt1='2016-11-24' 
    and id is not null 
) 

select x.id 

from ev_data x 
left join date_prob y 

where y.id is null 
; 

Пример данных -

id  dt1   orig_ts 
1  2016-11-24  2016-11-10 
2  2016-11-24  2016-11-24 
3  2016-11-24  2010-01-01 
4  2016-11-24  2017-01-01 
5  2016-11-24  2016-11-24 
6  2016-11-24  2016-11-25 
7  2016-11-23  2016-11-23 

Поэтому из этой таблицы я хочу удалить те идентификаторы, где есть grea чем разница в день. Таким образом, запрос должен возвращать значения только там, где идентификатор равен 2,5 и 6.

ответ

0

Если вы хотите извлечь эти значения из таблицы, которая не существует в другой таблице, вы можете использовать left join и фильтр where second_table_key is null. Это будет работать даже есть значения NULL в ключах:

--this query will return records from table a that do not exist in b 
select a.id 
    from a left join b on a.id=b.id 
where b.id is null; --only not joined 

ли фиксированной ваш пример. это работает:

drop table if exists t1; 
create table t1 (id int,dt1 string,   orig_ts string); 
insert overwrite table t1 
select 1 id, '2016-11-24' dt1,  '2016-11-10' orig_ts union all 
select 2 id, '2016-11-24' dt1,  '2016-11-24' orig_ts union all 
select 3 id, '2016-11-24' dt1,  '2010-01-01' orig_ts union all 
select 4 id, '2016-11-24' dt1,  '2017-01-01' orig_ts union all 
select 5 id, '2016-11-24' dt1,  '2016-11-24' orig_ts union all 
select 6 id, '2016-11-24' dt1,  '2016-11-25' orig_ts union all 
select 7 id, '2016-11-23' dt1,  '2016-11-23' orig_ts; 

with date_prob as 
(
    select distinct id 
    from t1 
    where dt1='2016-11-24' 
    and dt1!=orig_ts 
    and (datediff(dt1,orig_ts) not in ('1','-1')) 
), 

ev_data as 
(
    select distinct id 
    from t1 
    where dt1='2016-11-24' 
    and id is not null 
) 

select x.id 
from ev_data x 
left join date_prob y on x.id=y.id 
where y.id is null 
; 

OK 
2 
5 
6 
Time taken: 14.166 seconds, Fetched: 3 row(s) 
hive> 

Работы, как ожидается,

+0

я попробовать это, но она возвращается пустой результат –

+0

Этот подход должен работать. Пожалуйста, укажите точный код с примером данных. Я попытаюсь воспроизвести. – leftjoin

+0

Я добавил оба вопроса к основному вопросу. Благодаря! –