google-bigquery - 如何使用 SPLIT 将行转置为列?
问题描述
我有一个名为“CampaignName”的 STRING 列,其中包含以下格式:“PRODUCT_PHASE_OBJECTIVE_BRAND_(21/01 - 31/01)”。
我想将所有行的每一部分转换为列。
使用这种结构:
- 产品
- 阶段
- 客观的
- 牌
- 日期
如果我只提取一个部分,产品,我可以运行这个查询
SELECT
cs.Date,
c.ExternalCustomerId,
c.CampaignName,
SPLIT(c.CampaignName, '_')[OFFSET(0)] part1,
SUM(cs.Impressions) AS Impressions,
SUM(cs.Interactions) AS Interactions,
(SUM(cs.Cost) / 1000000) AS Cost
FROM
`XXX-266809.zzz.Campaign_3867357697` c
LEFT JOIN
`XXX-266809.zzz.CampaignBasicStats_3867357697` cs
ON
(c.CampaignId = cs.CampaignId
AND cs._DATA_DATE BETWEEN
DATE_ADD(CURRENT_DATE(), INTERVAL -365 DAY) AND DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY))
WHERE
c._DATA_DATE = c._LATEST_DATE
GROUP BY
1, 2, 3, 4
ORDER BY
cs. Date DESC
但是如果我尝试转置到两列,我的查询将失败......
SELECT
cs.Date,
c.ExternalCustomerId,
c.CampaignName,
SPLIT(c.CampaignName, '_')[OFFSET(0)] part1,
SPLIT(c.CampaignName, '_')[OFFSET(1)] part12,
SUM(cs.Impressions) AS Impressions,
SUM(cs.Interactions) AS Interactions,
(SUM(cs.Cost) / 1000000) AS Cost
FROM
`XXX-266809.zzz.Campaign_3867357697` c
LEFT JOIN
`XXX-266809.zzz.CampaignBasicStats_3867357697` cs
ON
(c.CampaignId = cs.CampaignId
AND cs._DATA_DATE BETWEEN
DATE_ADD(CURRENT_DATE(), INTERVAL -365 DAY) AND DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY))
WHERE
c._DATA_DATE = c._LATEST_DATE
GROUP BY
1, 2, 3, 4
ORDER BY
cs. Date DESC
如何创建良好的结构并转置“CampaignName”中的数据?
谢谢!
解决方案
推荐阅读
- sqlite - 如何获取具有特定 ID 的最后一个日志条目
- php - 为字段分配名称 SQL
- python - 如何汇总一周中每一天的数据?
- c - 无法在 Mac Mojave 上将任何 C 程序与 gcc 链接
- javascript - Javascript SSN掩码为某种格式
- swift - 使用刷新令牌获取新的授权令牌并重复失败的 api 调用
- python - 从 pandas DataFrame 中选择行:只需要选择至少包含三个行的行
- node.js - 当我通过 SSH 连接到我的 EC2 实例时,如何确定它当前正在运行什么服务器?
- json - SyntaxError:JSON.parse 中位置 1 处的 JSON 中的意外标记 e(
) - python-2.7 - 如何在将文件存储到 GCS 存储桶时重命名文件