GoogleData Studio中如何使用CASE表达式匹配多行(SQL/Big查询数据集)
How to use a CASE expression to match multiples rows in Google Data Studio (SQL/Big Query data set)
我有一个 BigQuery table,其中包含一个包含 'categories' 列表的列(由“/”分隔):
{
"ID": "452",
"Location": "France",
"Calories": "400",
"Categories": "/ brown / nutty / salty /"
},
{
"ID": "288",
"Location": "UK",
"Calories": "800",
"Categories": "/ brown / roasted / nutty /"
},
我在 Google Data Studio 中使用以下 SQL 查询连接到我的 table:
#standardSQL
SELECT
ID,
Location,
Calories,
Categories
FROM table_name;
我正在尝试按 'Categories' 对 table 中的行进行分组。
然后我应该能够按类别过滤行,并且可以计算指标的平均值。在上面的示例中,如果我按 'Nutty' 过滤,则平均值 'Calories' 将为“600”。
我试过的 CASE 表达式只允许我匹配类别列中的最后一个 'Category',而不是匹配包含字符串的所有行:
CASE
WHEN REGEXP_MATCH(Categories, '.*nutty.*') THEN 'Nutty'
WHEN REGEXP_MATCH(Categories, '.*brown.*') THEN 'Brown'
WHEN REGEXP_MATCH(Categories, '.*salty.*') THEN 'Salty'
END
我认为这是一个聚合问题,但是有什么方法可以让每一行以这种方式在 'Category' 维度中多次匹配?
非常感谢任何帮助,谢谢。
此处的数据如下所示:
- 观看次数:349493
- 标签:"javascript|html|css"
解决方案:JOIN
到SPLIT(tags) tag
,GROUP BY tag
。
#standardSQL
SELECT SUM(view_count) views, tag
FROM (
SELECT *
FROM `bigquery-public-data.Whosebug.posts_questions`, UNNEST(SPLIT(tags,'|')) tag
)
GROUP BY tag
ORDER BY 1 DESC
LIMIT 10
在您的用例中使用 CASE
是不切实际的 - 您应该使用 REGEXP_EXTRACT_ALL()
或 SPLIT()
以及 UNNEST()
如下例所示(BigQuery Standard SQL)
#standardSQL
WITH `project.dataset.your_table` AS (
SELECT "452" ID,"France" Location,400 Calories,"/ brown / nutty / salty /" Categories
UNION ALL
SELECT "288","UK",800,"/ brown / roasted / nutty /"
)
SELECT ID, Location, Calories, Category
FROM `project.dataset.your_table`,
UNNEST(REGEXP_EXTRACT_ALL(Categories, r' (\w+) ')) Category
这会给你下面的结果
Row ID Location Calories Category
1 452 France 400 brown
2 452 France 400 nutty
3 452 France 400 salty
4 288 UK 800 brown
5 288 UK 800 roasted
6 288 UK 800 nutty
现在,您可以 GROUP BY
任何您想要的逻辑,所有类别都将被适当地考虑
我有一个 BigQuery table,其中包含一个包含 'categories' 列表的列(由“/”分隔):
{
"ID": "452",
"Location": "France",
"Calories": "400",
"Categories": "/ brown / nutty / salty /"
},
{
"ID": "288",
"Location": "UK",
"Calories": "800",
"Categories": "/ brown / roasted / nutty /"
},
我在 Google Data Studio 中使用以下 SQL 查询连接到我的 table:
#standardSQL
SELECT
ID,
Location,
Calories,
Categories
FROM table_name;
我正在尝试按 'Categories' 对 table 中的行进行分组。
然后我应该能够按类别过滤行,并且可以计算指标的平均值。在上面的示例中,如果我按 'Nutty' 过滤,则平均值 'Calories' 将为“600”。
我试过的 CASE 表达式只允许我匹配类别列中的最后一个 'Category',而不是匹配包含字符串的所有行:
CASE
WHEN REGEXP_MATCH(Categories, '.*nutty.*') THEN 'Nutty'
WHEN REGEXP_MATCH(Categories, '.*brown.*') THEN 'Brown'
WHEN REGEXP_MATCH(Categories, '.*salty.*') THEN 'Salty'
END
我认为这是一个聚合问题,但是有什么方法可以让每一行以这种方式在 'Category' 维度中多次匹配?
非常感谢任何帮助,谢谢。
此处的数据如下所示:
- 观看次数:349493
- 标签:"javascript|html|css"
解决方案:JOIN
到SPLIT(tags) tag
,GROUP BY tag
。
#standardSQL
SELECT SUM(view_count) views, tag
FROM (
SELECT *
FROM `bigquery-public-data.Whosebug.posts_questions`, UNNEST(SPLIT(tags,'|')) tag
)
GROUP BY tag
ORDER BY 1 DESC
LIMIT 10
在您的用例中使用 CASE
是不切实际的 - 您应该使用 REGEXP_EXTRACT_ALL()
或 SPLIT()
以及 UNNEST()
如下例所示(BigQuery Standard SQL)
#standardSQL
WITH `project.dataset.your_table` AS (
SELECT "452" ID,"France" Location,400 Calories,"/ brown / nutty / salty /" Categories
UNION ALL
SELECT "288","UK",800,"/ brown / roasted / nutty /"
)
SELECT ID, Location, Calories, Category
FROM `project.dataset.your_table`,
UNNEST(REGEXP_EXTRACT_ALL(Categories, r' (\w+) ')) Category
这会给你下面的结果
Row ID Location Calories Category
1 452 France 400 brown
2 452 France 400 nutty
3 452 France 400 salty
4 288 UK 800 brown
5 288 UK 800 roasted
6 288 UK 800 nutty
现在,您可以 GROUP BY
任何您想要的逻辑,所有类别都将被适当地考虑