sql - 如何为输出表命名?
问题描述
我需要使用两个输出表进行 JOIN(这些表是使用其他表的先前操作产生的)。我想给他们具体的名字来引用他们。我尝试过 ALIAS、AS、INTO,但没有任何效果。我是 SQL 新手,我真的很想在这里得到一些帮助。我的代码如下
WITH SENDS AS (SELECT "CL" AS Country,
campaign_id AS ID_Campaign,
FORMAT_DATE("%m/%d/%Y",DATE(event_time)) AS Launch_date,
COUNT(campaign_id) AS Sents
FROM `linio-bi.marketing_emarsys_legacy.email_sends_783270611`
WHERE EXTRACT(YEAR FROM DATE(event_time)) >= 2019
GROUP BY ID_Campaign,Launch_date),
BOUNCES AS (SELECT "CL" AS Country,
campaign_id AS ID_Campaign,
FORMAT_DATE("%m/%d/%Y",DATE(event_time)) AS Launch_date,
COUNT(campaign_id) AS Bounces
FROM `linio-bi.marketing_emarsys_legacy.email_bounces_783270611`
WHERE EXTRACT(YEAR FROM DATE(event_time)) >= 2019
GROUP BY ID_Campaign,Launch_date),
OPENS AS (SELECT "CL" AS Country,
campaign_id AS ID_Campaign,
FORMAT_DATE("%m/%d/%Y",DATE(event_time)) AS Launch_date,
COUNT(campaign_id) AS Opens
FROM `linio-bi.marketing_emarsys_legacy.email_opens_783270611`
WHERE EXTRACT(YEAR FROM DATE(event_time)) >= 2019
GROUP BY ID_Campaign,Launch_date),
COMPLAINED AS(SELECT "CL" AS Country,
campaign_id AS ID_Campaign,
FORMAT_DATE("%m/%d/%Y",DATE(event_time)) AS Launch_date,
COUNT(campaign_id) AS Complaints
FROM `linio-bi.marketing_emarsys_legacy.email_complaints_783270611`
WHERE EXTRACT(YEAR FROM DATE(event_time)) >= 2019
GROUP BY ID_Campaign,Launch_date),
UNSUSCRIBED AS (SELECT "CL" AS Country,
campaign_id AS ID_Campaign,
FORMAT_DATE("%m/%d/%Y",DATE(event_time)) AS Launch_date,
COUNT(campaign_id) AS Unsubscribed
FROM `linio-bi.marketing_emarsys_legacy.email_unsubscribes_783270611`
WHERE EXTRACT(YEAR FROM DATE(event_time)) >= 2019
GROUP BY ID_Campaign,Launch_date),
CLICKS AS (SELECT "CL" AS Country,
campaign_id AS ID_Campaign,
FORMAT_DATE("%m/%d/%Y",DATE(event_time)) AS Launch_date,
COUNT(campaign_id) AS Clicks
FROM `linio-bi.marketing_emarsys_legacy.email_clicks_783270611`
WHERE EXTRACT(YEAR FROM DATE(event_time)) >= 2019
GROUP BY ID_Campaign,Launch_date)
-- TABLE 1
SELECT A.Country,
A.ID_Campaign,
A.Launch_date,
IFNULL(A.Sents,0) Sents,
IFNULL(B.Bounces,0) Bounces,
IFNULL(C.Opens, 0) Opens,
IFNULL(D.Complaints,0) Complaints,
IFNULL(E.Unsubscribed,0) Unsubscribed,
IFNULL(F.Clicks,0) Clicks
FROM SENDS A
LEFT JOIN BOUNCES B ON B.ID_Campaign = A.ID_Campaign AND B.Launch_date = A.Launch_date
LEFT JOIN OPENS C ON C.ID_Campaign = A.ID_Campaign AND C.Launch_date = A.Launch_date
LEFT JOIN COMPLAINED D ON C.ID_Campaign = A.ID_Campaign AND D.Launch_date = A.Launch_date
LEFT JOIN UNSUSCRIBED E ON C.ID_Campaign = A.ID_Campaign AND E.Launch_date = A.Launch_date
LEFT JOIN CLICKS F ON C.ID_Campaign = A.ID_Campaign AND F.Launch_date = A.Launch_date
ORDER BY A.ID_Campaign,A.Launch_date;
-- TABLE 2
SELECT "CL" AS Country,
T.campaign_id AS ID_Campaign,
T.name AS Campaign_name,
CONCAT(CAST(T.campaign_id as STRING) ,'-',T.name) full_campaign
FROM(SELECT T.*,
ROW_NUMBER() OVER (PARTITION BY campaign_id ORDER BY event_time DESC) as seqnum
FROM `linio-bi.marketing_emarsys_legacy.email_campaigns_v2_783270611` T
) T
WHERE seqnum = 1
我想在 ID_Campaing 上的表 1 和表 2 之间进行 LEFT JOIN,但我也想给它们命名,当然我也想给这个 JOIN 的输出命名。有什么提示吗?
解决方案
您似乎对常用表表达式非常熟练,令人费解的是为什么您没有采取最后一步将最后两个变成 CTE:
WITH SENDS AS (...),
BOUNCES AS (...),
OPENS AS (...),
COMPLAINED AS(...),
UNSUSCRIBED AS (...),
CLICKS AS (...),
-- now make two more CTE's:
TABLE1 AS (
SELECT A.Country,
A.ID_Campaign,
A.Launch_date,
IFNULL(A.Sents,0) Sents,
IFNULL(B.Bounces,0) Bounces,
IFNULL(C.Opens, 0) Opens,
IFNULL(D.Complaints,0) Complaints,
IFNULL(E.Unsubscribed,0) Unsubscribed,
IFNULL(F.Clicks,0) Clicks
FROM SENDS A
LEFT JOIN BOUNCES B ON B.ID_Campaign = A.ID_Campaign AND B.Launch_date = A.Launch_date
LEFT JOIN OPENS C ON C.ID_Campaign = A.ID_Campaign AND C.Launch_date = A.Launch_date
LEFT JOIN COMPLAINED D ON C.ID_Campaign = A.ID_Campaign AND D.Launch_date = A.Launch_date
LEFT JOIN UNSUSCRIBED E ON C.ID_Campaign = A.ID_Campaign AND E.Launch_date = A.Launch_date
LEFT JOIN CLICKS F ON C.ID_Campaign = A.ID_Campaign AND F.Launch_date = A.Launch_date
ORDER BY A.ID_Campaign,A.Launch_date
),
TABLE2 AS (
SELECT "CL" AS Country,
T.campaign_id AS ID_Campaign,
T.name AS Campaign_name,
CONCAT(CAST(T.campaign_id as STRING) ,'-',T.name) full_campaign
FROM(SELECT T.*,
ROW_NUMBER() OVER (PARTITION BY campaign_id ORDER BY event_time DESC) as seqnum
FROM `linio-bi.marketing_emarsys_legacy.email_campaigns_v2_783270611` T
) T
WHERE seqnum = 1)
-- and finally join them
SELECT ...
FROM TABLE1 JOIN TABLE2 ON ...
推荐阅读
- javascript - Javascript - 如何在 HTML 中显示 SessionStorage obj
- sql - 如何根据连接查询更新多行
- r - GGally::ggpairs 图不显示相关系数
- python - 在一个范围内调用一次函数
- asp.net-core - ASP.NET MVC Core - 业务层中的 ViewModel 并实现数据注释
- excel - 将保存在文件夹中的一个特定工作簿中的多个工作表合并到新文件中的一张工作表中
- github - GitHub 在我没有上传的情况下找到了我的个人资料图片。那个怎么样?
- api - 创建用于构建和开发 Vue 应用程序的虚假数据 (API)
- node.js - 从数据库中删除后,axios delete 给出 404
- sql - 如何将一行添加到另一行