【问题标题】:Syntax to run a distinct GROUP_CONCAT in Google Bigquery在 Google Bigquery 中运行不同的 GROUP_CONCAT 的语法
【发布时间】:2015-02-04 15:03:03
【问题描述】:

我有这个问题:

SELECT campaign.id AS campaign_id,
       GROUP_CONCAT(utm.campaign) AS utm_campaign
FROM [email_event]
WHERE (TIMESTAMP BETWEEN SEC_TO_TIMESTAMP(1412136000) AND SEC_TO_TIMESTAMP(1414814340))
GROUP BY campaign_id;

我很想运行一个不同的 GROUP_CONCAT,因为现在输出中会重复相同的条目。

更新

我已将您的解决方案扩展到此:

SELECT campaign.id AS campaign_id,
       GROUP_CONCAT(utm.campaign) AS utm_campaign,
       GROUP_CONCAT(utm.content) AS utm_content
FROM
  (SELECT *
   FROM
     (SELECT 507 AS campaign.id,
             'remarketingemail' AS utm.campaign,
             'newsletter_feb' AS utm.content),
     (SELECT 508 AS campaign.id,
             'remarketingemail' AS utm.campaign,
             'newsletter_jan' AS utm.content),
     (SELECT 508 AS campaign.id,
             'remarketingemail' AS utm.campaign,
             'newsletter_feb' AS utm.content),
     (SELECT 508 AS campaign.id,
             'adwordscamp' AS utm.campaign,
             'cyber_monday' AS utm.content) )
GROUP BY campaign_id;

但现在我得到了 utm_campaign 的重复值。

+-----+------------------------------------------+--------------------------------------+
| 507 | remarketingemail                         | newsletter_feb                       |
| 508 | remarketingemail,remarketingemail,adw... | newsletter_jan,newsletter_feb,cyb... |
+-----+------------------------------------------+--------------------------------------+

这是子查询的原始输出,在 qroup by 之前

+-----+-----------------------------------+-------------------------------+
| 507 | remarketingemail                  | newsletter_feb                |
| 508 | remarketingemail                  | newsletter_jan                |
| 508 | remarketingemail                  | newsletter_feb                |
| 508 | adwordscamp                       | cyber_monday                  |
+-----+-----------------------------------+-------------------------------+

【问题讨论】:

  • 能否也分享一下子查询的结果?
  • @N.N.子查询的结果是您可以从我上面的表中扣除的 3 行。问题是“remarketingemail”在 group_concat 中被复制,并且不知道如何获得唯一性。
  • 可以分享源数据吗?从你的问题很难理解每个字段的基数。
  • @N.N.更新了问题
  • 如果 utm.campaign 与campaign_id 有1:1 或m:1 的关系,您可以使用不同的聚合函数,例如MAX()。

标签: google-bigquery


【解决方案1】:

使用子查询进行分组并获取不同的值。像这样:

SELECT campaign.id AS campaign_id,
       GROUP_CONCAT(utm.campaign) AS utm_campaign
FROM
    (Select campaign.id,utm.campaign
    FROM [email_event]
    WHERE (TIMESTAMP BETWEEN SEC_TO_TIMESTAMP(1412136000) AND SEC_TO_TIMESTAMP(1414814340))
    GROUP EACH BY campaign.id,utm.campaign)
    GROUP BY campaign_id;

少数聚合字段的另一种选择是分阶段进行......

SELECT campaign_id ,
       GROUP_CONCAT(utm_campaign) as utm_campaign,
       utm_content
       From
(SELECT campaign.id AS campaign_id,
       utm.campaign as utm_campaign,
       GROUP_CONCAT(utm.content) AS utm_content
FROM
    (
SELECT *
FROM
  ( SELECT 507 AS campaign.id,
           'remarketingemail' AS utm.campaign,
           'newsletter_feb' AS utm.content),
  ( SELECT 507 AS campaign.id,
           'remarketingemail2' AS utm.campaign,
           'newsletter_feb' AS utm.content),
  (SELECT 508 AS campaign.id,
          'remarketingemail' AS utm.campaign,
          'newsletter_jan' AS utm.content),
  (SELECT 508 AS campaign.id,
          'remarketingemail' AS utm.campaign,
          'newsletter_feb' AS utm.content)
      )
    GROUP BY utm_campaign,campaign_id)
    GROUP BY utm_content,campaign_id
    ;

【讨论】:

  • 查看我对问题的更新,当有两个 group_concats 时,distinct 不能正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 2020-02-04
  • 2018-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多