Создание вида из 3 представлений в SQL - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть 3 просмотра:

v_sessions, v_clickouts и v_sales

Я пытаюсь объединить все в одно представление на основе этих правил:

  1. v_session .session_id = v_clickouts.clickout_id
  2. v_clickouts.clickout_id = v_sales.clickout_id

Я могу сделать это, используя 'LEFT JOIN':

LEFT JOIN v_clickouts clickouts ON 
    sessions.session_id = clickouts.session_id 
    AND sessions.user_id = clickouts.user_id 
    AND sessions.click_type = clickouts.click_type 
    AND sessions.click_id = clickouts.click_id 
    AND sessions.cid = clickouts.cid
    AND sessions.project::text = clickouts.project::text 
    AND sessions.event_time::date <= clickouts.event_time::date
LEFT JOIN v_sales sales ON 
    clickouts.clickout_id = sales.clickout_id 
    AND sessions.user_id = sales.user_id
    AND clickouts.project::text = sales.project::text 
    AND clickouts.event_time::date <= sales.event_time::date
;

By Имея дополнительные условия «И», я теряю данные с правой стороны из-за несоответствия некоторых условий. Я хочу оставить только два условия:

LEFT JOIN v_clickouts clickouts ON 
    sessions.session_id = clickouts.session_id 
LEFT JOIN v_sales sales ON 
    clickouts.clickout_id = sales.clickout_id 
;

И переместить все условия «И» в оператор «CASE», который создаст новый столбец для каждого «И», чтобы представление могло иметь дополнительные такие столбцы, как:

session_user_id_equals_clickouts_user_id    session_click_type_equals_clickouts_click_type  clickouts_event_time_is_less_than_sales_event_time
TRUE                                        TRUE                                            TRUE
FALSE                                       TRUE                                            FALSE
TRUE                                        TRUE                                            FALSE

Я не знаю, как я смог бы добиться этого, используя метод 'CASE'.

Спасибо за ваши предложения.

РЕДАКТИРОВАТЬ

Пример данных - я получаю их после первого объединения v_sessions и v_clickouts:

session_event_time  session_id  user_id     cid     click_type_from_session click_id    clickout_event_time click_type_from_session     clickout_id       
2019-12-18 11:21    id_1        user_id_1   cid_1   type_1                  click_id_1  2019-12-18 11:21    type_1                      clickout_id_1     
2019-12-18 18:35    id_2        user_id_2   cid_2   type_1                  click_id_2  2019-12-18 18:38    type_1                      clickout_id_2     

Эти два представления объединяются только с помощью session_id, я хочу иметь метод CASE, чтобы определить, например:

sessions.click_type = clickouts.click_type as 1
sessions.click_id = clickouts.click_id as 2
sessions.cid = clickouts.cid as 3
sessions.project::text = clickouts.project::text as 4

И это приведет к наличию 4 дополнительных столбцов в окончательном виде вот так (я назвал новые столбцы 1, 2, 3, 4 для более коротких имен):

session_event_time  session_id  user_id     cid     click_type_from_session click_id    clickout_event_time click_type_from_session     clickout_id       1       2       3       4
2019-12-18 11:21    id_1        user_id_1   cid_1   type_1                  click_id_1  2019-12-18 11:21    type_1                      clickout_id_1     TRUE    FALSE   TRUE    TRUE
2019-12-18 18:35    id_2        user_id_2   cid_2   type_1                  click_id_2  2019-12-18 18:38    type_1                      clickout_id_2     FALSE   TRUE    TRUE    FALSE

Поскольку я не отображаю все параметры, которые проверяю условия для меня нужны только столбцы с указанием TRUE или FALSE.

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