首页 > 解决方案 > 在 SQL 中从 3 个视图创建一个视图

问题描述

我有 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
;

由于某些条件不匹配,通过附加“与”条件,我会从右侧丢失数据。我只想留下两个条件:

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

并将所有“AND”条件移动到“CASE”语句,该语句将为每个“AND”创建一个新列,因此视图可以具有其他列,例如:

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

标签: sqljoinview

解决方案


您可以使用:

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
;

推荐阅读