【问题标题】:Trying to get unique source, medium, campaign using STRING_AGG function by visitNumber尝试通过 visitNumber 使用 STRING_AGG 函数获取唯一的来源、媒介、活动
【发布时间】:2019-11-30 18:14:40
【问题描述】:

我正在尝试使用 STRING_AGG 函数按 fullVisitorId 和 ORDER BY visitNumber 分区来获得唯一的来源、媒介和活动。 但是,我在使用 STRING_AGG 的来源、媒体和广告系列中获得了很多重复字段。

所以我想到了使用 DISTINCT,但它不适用于 STRING_AGG。

任何建议表示赞赏。

代码:

SELECT
  CAST(concat(SUBSTR(date,0,4), '-', SUBSTR(date,5,2),'-',SUBSTR(date,7,2)) as date ) as date,
  fullVisitorId,
  trafficSource.keyword,
  trafficSource.adContent,

STRING_AGG(channelGrouping), ' > ') OVER (PARTITION BY fullVisitorId ORDER BY visitNumber) AS channelPath,
STRING_AGG(trafficSource.medium), ' > ') OVER (PARTITION BY fullVisitorId ORDER BY visitNumber ) AS medium_Path,
STRING_AGG(trafficSource.source), ' > ') OVER (PARTITION BY fullVisitorId ORDER BY visitNumber) AS source_Path,
STRING_AGG(trafficSource.campaign), ' > ') OVER (PARTITION BY fullVisitorId ORDER BY visitNumber) AS campaign_Path

FROM
  `tfa-big-query.74006564.ga_sessions_*`,UNNEST(hits) as hit
WHERE _table_suffix BETWEEN '20180801' and '201808015'

STRING_AGG列中的结果(channelgrouping、medium和source是重复字段的出现,可以看出如下:

实际结果:

自然搜索>自然搜索>自然搜索

预期输出:

自然搜索

【问题讨论】:

    标签: google-analytics google-bigquery


    【解决方案1】:

    以下是 BigQuery 标准 SQL

    #standardSQL
    CREATE TEMP FUNCTION DeDup(arr ANY TYPE) AS ((
      SELECT STRING_AGG(str, ' > ') FROM (
        SELECT CONCAT(ANY_VALUE(x), ' (', CAST(COUNT(1) AS STRING), ')') str FROM (
          SELECT x, COUNTIF(flag) OVER(ORDER BY OFFSET) grp FROM (
            SELECT *,x!=IFNULL(LAG(x) OVER(ORDER BY OFFSET), x) flag FROM UNNEST(arr) x WITH OFFSET
          ))
        GROUP BY grp
    )));
    SELECT 
      DATE,
      fullVisitorId,
      keyword,
      adContent,
      DeDup(channelPath) AS channelPath,
      DeDup(medium_Path) AS medium_Path,
      DeDup(source_Path) AS source_Path,
      DeDup(campaign_Path) AS campaign_Path
    FROM (
      SELECT
        CAST(CONCAT(SUBSTR(DATE,0,4), '-', SUBSTR(DATE,5,2),'-',SUBSTR(DATE,7,2)) AS DATE ) AS DATE,
        fullVisitorId,
        trafficSource.keyword,
        trafficSource.adContent,
        ARRAY_AGG(channelGrouping) OVER(PARTITION BY fullVisitorId ORDER BY visitNumber) AS channelPath,
        ARRAY_AGG(trafficSource.medium) OVER(PARTITION BY fullVisitorId ORDER BY visitNumber ) AS medium_Path,
        ARRAY_AGG(trafficSource.source) OVER(PARTITION BY fullVisitorId ORDER BY visitNumber) AS source_Path,
        ARRAY_AGG(trafficSource.campaign) OVER(PARTITION BY fullVisitorId ORDER BY visitNumber) AS campaign_Path
      FROM `tfa-big-query.74006564.ga_sessions_*`,UNNEST(hits) as hit
      WHERE _table_suffix BETWEEN '20180801' and '201808015'
    )
    

    上面会返回类似

    的东西

    自然搜索 (3) > 其他 (2) > 直接 (1) > 自有 (1) > 电子邮件 (2) > (none) (2)

    这是您预期结果的一点扩展Organic Search < Other < Direct < Owned < email < (None)

    【讨论】:

      【解决方案2】:

      我认为 STRING_AGG 与 DISTINCT 一起工作

      从 bigquery 文档中尝试这个 sql

      SELECT STRING_AGG(DISTINCT fruit, " & ") AS string_agg
      FROM UNNEST(["apple", NULL, "pear", "banana", "pear"]) AS fruit;
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多