如何在标准sql-大查询中将一列拆分为多列
Posted
技术标签:
【中文标题】如何在标准sql-大查询中将一列拆分为多列【英文标题】:How to split one single column to multiple columns in Standard sql- Big query 【发布时间】:2018-08-28 08:05:47 【问题描述】:使用 Google BigQuery
WITH prep AS (
SELECT
SPLIT(offer.name, '-') AS split,
id
FROM `hasoffer.offers_new` AS offer
)
SELECT *
FROM
(
SELECT
split[SAFE_ORDINAL(1)] AS Game,
split[SAFE_ORDINAL(2)] AS GEO,
IF ( REGEXP_CONTAINS ('INTERNAL - POGED',offers.name), "POGED",
IF(REGEXP_CONTAINS ('INTERNAL',offers.name), "Internal", IF(
REGEXP_CONTAINS('REDIRECT',offers.name), "REDIRECT", "Public"))) AS
Category,
DATE(conv.datetime) AS Date,
(SUM(conv.revenue_cents)/100) AS Revenue
FROM `hasoffer.offers_new` AS offers
LEFT JOIN
prep
ON
offers.id=prep.id
LEFT JOIN
`hasoffer.conversions` AS conv
ON offers.id = conv.offer_id
WHERE
conv.advertiser_id = 632
AND EXTRACT(MONTH FROM conv.datetime) = EXTRACT(MONTH FROM CURRENT_DATE())
AND EXTRACT(YEAR FROM conv.datetime) = 2018
AND conv.status != 'rejected'
AND conv.affiliate_sub1 IS NOT NULL
group by
GEO,
Game,
Category,
Date
order by
Date)AS SourceTable
这是表格的外观:
预期输出:
“日期”列必须分成多列,每列代表一个月中的一天,并且应包含不同游戏和地理区域的收入总和值。
此外,必须创建一个名为“总计”的列,该列提供当月游戏广告地理的总收入。请提出一种方法来做到这一点
【问题讨论】:
在标准 SQL 中没有split
并且使用 extract
提取日期的一部分。除此之外,我不明白你在做什么。
请同时发布您的预期输出。
如果您单击图像并查看表格,您可以看到列日期。如上所述,我正在尝试将该列拆分为多个列
您指的是 Google 的 Google Big Query 的“标准 SQL”吗?
您正在尝试“透视”您的数据,这通常是您在报告层(例如 Google Data Studio) 中而不是在 SQL 中执行的操作。也就是说,如果您明确说明所需的列数,则可以在 SQL 中进行透视;因此,要编写适用于任何给定月份的 SQL,您需要始终拥有 31 个日期列和一个总计,即使是 2 月也是如此。那是你要的吗?为什么要在 SQL 中而不是在 Data Studio 或其他报告环境中进行呢?
【参考方案1】:
要使用 BigQuery 进行所需的数据透视,您可以使用...
SELECT
Game,
Geo,
Category,
SUM(CASE WHEN EXTRACT(DAY FROM Date) = 01 THEN Revenue ELSE 0 END) AS DAY_OF_MONTH_01,
SUM(CASE WHEN EXTRACT(DAY FROM Date) = 02 THEN Revenue ELSE 0 END) AS DAY_OF_MONTH_02,
SUM(CASE WHEN EXTRACT(DAY FROM Date) = 03 THEN Revenue ELSE 0 END) AS DAY_OF_MONTH_03,
...
SUM(CASE WHEN EXTRACT(DAY FROM Date) = 30 THEN Revenue ELSE 0 END) AS DAY_OF_MONTH_30,
SUM(CASE WHEN EXTRACT(DAY FROM Date) = 31 THEN Revenue ELSE 0 END) AS DAY_OF_MONTH_31,
SUM(Revenue) AS GRAND_TOTAL
FROM
yourSource
WHERE
Date >= DATE '2018-08-01'
AND Date < DATE '2018-09-01'
GROUP BY
Game,
Geo,
Category
然后列标题不包含月份,但这是因为它们不能从数据中导出。我仍然认为您应该在电子表格中进行透视,使用此查询作为源...
SELECT
Game,
Geo,
Category,
Date,
SUM(Revenue) AS Revenue
FROM
yourSource
WHERE
Date >= DATE '2018-08-01'
AND Date < DATE '2018-09-01'
GROUP BY
Game,
Geo,
Category,
Date
那么你不能有“巨大”的数据,你只有你需要的,然后让工作表旋转它......
【讨论】:
以上是关于如何在标准sql-大查询中将一列拆分为多列的主要内容,如果未能解决你的问题,请参考以下文章