首页 文章

如何使用CASE表达式匹配Google Data Studio中的多个行(SQL / Big Query数据集)

提问于
浏览
0

我有一个BigQuery表,其中包含一个列,其中包含“类别”列表(由“/”分隔):

{
    "ID": "452",
    "Location": "France",
    "Calories": "400",
    "Categories": "/ brown / nutty / salty /"
  },
  {
    "ID": "288",
    "Location": "UK",
    "Calories": "800",
    "Categories": "/ brown / roasted / nutty /"
  },

我使用Google Data Studio中的以下SQL查询连接到我的表:

#standardSQL
SELECT
ID,
Location,
Calories,
Categories
FROM table_name;

我试图通过'Categories'对表中的行进行分组 .

然后,我应该能够按类别过滤行,并且可以对指标进行平均 . 在上面的例子中,如果我按'坚果'过滤,平均'卡路里'将是'600' .

我试过的CASE表达式只允许我匹配Category列中的最后一个'Category',而不是匹配包含该字符串的所有行:

CASE
WHEN REGEXP_MATCH(Categories, '.*nutty.*') THEN 'Nutty'
WHEN REGEXP_MATCH(Categories, '.*brown.*') THEN 'Brown'
WHEN REGEXP_MATCH(Categories, '.*salty.*') THEN 'Salty'
END

我认为这是一个聚合问题,但有没有办法允许每行在“类别”维度内以这种方式多次匹配?

任何帮助非常感谢,谢谢 .

2 回答

  • 1

    在您的用例中使用 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 你想要的任何逻辑,所有类别将被适当地计算

  • 2

    这里的数据如下:

    • views:349493

    • 标签:"javascript|html|css"

    解决方案: JOINSPLIT(tags) tagGROUP BY tag .

    #standardSQL
    SELECT SUM(view_count) views, tag
    FROM (
      SELECT *
      FROM `bigquery-public-data.stackoverflow.posts_questions`, UNNEST(SPLIT(tags,'|')) tag
    )
    GROUP BY tag
    ORDER BY 1 DESC
    LIMIT 10
    

    enter image description here

相关问题