Объединение двух CTE дает другой результат, чем если бы CTE были таблицами - PullRequest
1 голос
/ 16 мая 2019

Я создаю две таблицы, первая имеет серийный номер, а вторая таблица представляет собой отфильтрованную версию первой таблицы и содержит оригинальный серийный номер, а также дополнительные столбцы. Затем я делаю левое соединение первой таблицы со второй таблицей серийного номера, чтобы создать третью таблицу. Когда я пытаюсь сделать то же самое с CTE, чтобы создать 1 таблицу вместо 3, объединение не работает.

Вместо этого я успешно сделал две таблицы как CTE, однако, когда я объединяю их по левому краю, чтобы получить третью таблицу, результат неверен.

create table purchases_base_auto(serial int, ts timestamp, query_string string, package string, tags string);

insert into purchases_base_auto partition(dt)
select row_number() over() serial, regexp_replace(regexp_replace(get_json_object(regexp_replace(w.air_json, '@timestamp', 'ts'),'$.ts'),'T',' '),'Z',' ') tstamp, get_json_object(regexp_replace(w.air_json, 'query-string', 'query_string'), '$.query_string') query_string, get_json_object(w.air_json, '$.package') package, 
get_json_object(w.air_json, '$.tags') tags
,w.dt from  wifi.wifi_airlogs w 
where 
((get_json_object(w.air_json, '$.event') = 'purchase') and w.dt = date_add(current_date,-7) ;

create table purchases_join_auto(serial int, ts timestamp, query_string string, package string, tags string, depart timestamp, arrive timestamp);

insert into purchases_join_auto partition(dt) select * from (select w.serial, w.ts tstamp, w.query_string,w.package,w.tags, 
f.ACT_DPRT_DTMZ depart, f.ACT_ARRV_DTMZ arrive 
,w.dt from  purchases_base_auto w inner join sb_wifi.ft_data f on w.tail = f.registration_id) as q where
(q.tstamp between CAST(from_unixtime(unix_timestamp(q.depart) - 840) as timestamp) and CAST(from_unixtime(unix_timestamp(q.arrive) + 840) as timestamp));


create table purchases_final_auto(serial int, ts timestamp, query_string string, package string, tags string, depart timestamp, arrive timestamp);

insert into purchases_final_auto partition(dt) select w.serial, w.ts, w.query_string, w.package, w.tags, f.depart, f.arrive, w.dt from  purchases_base_auto w left outer join purchases_join_auto f on w.serial = f.serial;

То же самое с CTE дает проблемы при окончательном объединении для создания третьей таблицы

select row_number() over() serial, regexp_replace(regexp_replace(get_json_object(regexp_replace(w.air_json, '@timestamp', 'ts'),'$.ts'),'T',' '),'Z',' ') tstamp,
get_json_object(regexp_replace(w.air_json, 'query-string', 'query_string'), '$.query_string') query_string, get_json_object(w.air_json, '$.package') package, 
get_json_object(w.air_json, '$.tags') tags
from wifi_airlogs w 
where 


((get_json_object(w.air_json, '$.event') = 'purchase') and w.dt = '2019-04-15')),


jtable as (

select btable.serial serialt, btable.tstamp, btable.query_string, btable.package, btable.tags, f.ACT_DPRT_DTMZ depart, f.ACT_ARRV_DTMZ arrive 
from btable inner join 041519_flifo_data f on btable.tail = f.registration_id where
(btable.tstamp between CAST(from_unixtime(unix_timestamp(f.ACT_DPRT_DTMZ) - 840) as timestamp) and CAST(from_unixtime(unix_timestamp(f.ACT_ARRV_DTMZ) + 840) as timestamp)))



create table final_cte as select btable.serial serialt, btable.tstamp, btable.tail, btable.query_string, btable.package, btable.tags, jtable.depart, jtable.arrive 
from btable left outer join jtable on btable.serial = jtable.serialt;

Я ожидаю, что метод CTE даст тот же результат, что и выше, однако он возвращает другой результат (соединения не выполняются правильно)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...