sql - 在 SQL 中从 3 个视图创建一个视图
问题描述
我有 3 个观点:
v_sessions、v_clickouts 和 v_sales
我正在尝试根据这些规则将所有内容加入到单个视图中:
- v_session.session_id = v_clickouts.clickout_id
- 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
。
解决方案
您可以使用:
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
;
推荐阅读
- ksh - 这个符号是什么意思“#?” 在 ksh
- javascript - 第一次安装expo,初始化后立即报错
- html - 未针对锚元素触发 MouseLeave 事件
- angular - 离子:第一次页面加载视频播放器工作,导航回视频播放器后不显示
- linked-list - 在 OCAML 中使用链表队列进行删除
- java - javac为什么不能用finalize编译类
- windows - Windows命令行:findstr.exe在find find.exe找到时无法在某些文件中找到字符串
- python - 正则表达式如何仅删除包含某些特定字母的单词
- xml - 如何使用 PowerShell 中的 XPath 表达式检测 XML 中的嵌套列表?
- amazon-web-services - 使用 Cognito Admin API 创建用户