Google bigquery GROUP_CONCAT是一个分析函数,必须附带OVER子句

Google bigquery GROUP_CONCAT是一个分析函数,必须附带OVER子句,google-bigquery,Google Bigquery,我正在尝试使用bigquery遗留sql进行查询,如下所示: 表中的数据在更新时被追加,因此首先我需要使用MAXupdatedOn在查询之后的内部对最新更新的信息进行子选择。 标记是一个重复的字段,具有字符串值 SELECT all._id AS _id FROM [mytable] AS all JOIN EACH ( SELECT _id, MAX(updatedOn) AS updatedOn FROM [myt

我正在尝试使用bigquery遗留sql进行查询,如下所示:

表中的数据在更新时被追加,因此首先我需要使用MAXupdatedOn在查询之后的内部对最新更新的信息进行子选择。 标记是一个重复的字段,具有字符串值

 SELECT
    all._id AS _id
  FROM
    [mytable] AS all
  JOIN EACH (
    SELECT
      _id,
      MAX(updatedOn) AS updatedOn
    FROM
      [mytable]
    GROUP EACH BY
      _id) AS latest
  ON
    all._id = latest._id
    AND all.updatedOn = latest.updatedOn
  WHERE
      AND(NOT  REGEXP_MATCH (GROUP_CONCAT(all.tags), '(query)'))
标记是一个重复的字段,我试图选择没有标记查询的用户

如果我没有使用group_concat,那么如果用户至少有一个其他标记,它也会检索带有query标记的用户,因为当您有重复的字段时,bigquery会返回多行

因此,如果用户有x和query标记,这个查询将返回它,我不想返回。 但是如果用户只有查询标记if,则不会返回

希望我足够清楚。 我试过使用FlatteMyTable、标记和相同的结果


谢谢。

您可以使用不同的方法来获取最新的行,而不是MAX。我们将此设置作为一个视图。你想怎么调整就怎么调整

#legacySQL
SELECT * from (
select rank() over (partition by id order by bq.created DESC, bq.insert_id  desc) as _rank,
*
FROM [dataset:table]
) where _rank=1
获取不包含任何内容的旧SQL行非常简单,如下所示:

where NOT services contains 'Google'

在我的示例中,服务是一个重复的字段,而不是MAX。您可以使用不同的方法获取最新的行。我们将此设置作为一个视图。你想怎么调整就怎么调整

#legacySQL
SELECT * from (
select rank() over (partition by id order by bq.created DESC, bq.insert_id  desc) as _rank,
*
FROM [dataset:table]
) where _rank=1
获取不包含任何内容的旧SQL行非常简单,如下所示:

where NOT services contains 'Google'

在我的示例中,服务是一个重复的字段

,使用带有ORDER BY和LIMIT using的ARRAY_AGG更容易表示。使用此模式,您可以选择与最新更新相关联的行。比如说,

#standardSQL
SELECT s.*
FROM (
  SELECT
    ARRAY_AGG(t ORDER BY updatedOn DESC LIMIT 1)[OFFSET(0)] AS s
  FROM YourTable AS t
  WHERE NOT EXISTS (
    SELECT 1 FROM UNNEST(tags) AS tag WHERE tag LIKE '%query%'
  )
  GROUP BY _id
);
以下是一个您可以尝试的独立示例:

#standardSQL
WITH YourTable AS (
  SELECT 1 AS _id, DATE '2017-02-28' AS updatedOn, ['foo', 'bar', 'baz'] AS tags UNION ALL
  SELECT 1, DATE '2017-02-01', ['query01', 'foo'] UNION ALL
  SELECT 2, DATE '2017-03-01', ['bar', '10 query'] UNION ALL
  SELECT 2, DATE '2017-03-03', ['baz'] UNION ALL
  SELECT 2, DATE '2017-03-05', ['query']
)
SELECT s.*
FROM (
  SELECT
    ARRAY_AGG(t ORDER BY updatedOn DESC LIMIT 1)[OFFSET(0)] AS s
  FROM YourTable AS t
  WHERE NOT EXISTS (
    SELECT 1 FROM UNNEST(tags) AS tag WHERE tag LIKE '%query%'
  )
  GROUP BY _id
);

使用带有ORDER BY和LIMIT using的ARRAY_AGG更容易表达这一点。使用此模式,您可以选择与最新更新相关联的行。比如说,

#standardSQL
SELECT s.*
FROM (
  SELECT
    ARRAY_AGG(t ORDER BY updatedOn DESC LIMIT 1)[OFFSET(0)] AS s
  FROM YourTable AS t
  WHERE NOT EXISTS (
    SELECT 1 FROM UNNEST(tags) AS tag WHERE tag LIKE '%query%'
  )
  GROUP BY _id
);
以下是一个您可以尝试的独立示例:

#standardSQL
WITH YourTable AS (
  SELECT 1 AS _id, DATE '2017-02-28' AS updatedOn, ['foo', 'bar', 'baz'] AS tags UNION ALL
  SELECT 1, DATE '2017-02-01', ['query01', 'foo'] UNION ALL
  SELECT 2, DATE '2017-03-01', ['bar', '10 query'] UNION ALL
  SELECT 2, DATE '2017-03-03', ['baz'] UNION ALL
  SELECT 2, DATE '2017-03-05', ['query']
)
SELECT s.*
FROM (
  SELECT
    ARRAY_AGG(t ORDER BY updatedOn DESC LIMIT 1)[OFFSET(0)] AS s
  FROM YourTable AS t
  WHERE NOT EXISTS (
    SELECT 1 FROM UNNEST(tags) AS tag WHERE tag LIKE '%query%'
  )
  GROUP BY _id
);

我理解你的问题的方式是——为每个_id获取最新的条目,只输出那些没有标记查询的条目

下面是BigQuery的遗留SQL和标准SQL的版本

传统SQL:

legacySQL 选择_id 从…起 选择 _身份证, 比赛, 行号按id超额分配,订单按最新更新的描述 从…起 在记录中选择_id、updatedOn、sumtag(如“%query%”)作为匹配项 从[mytable] 其中匹配项=0 和最新=1 标准SQL:

标准SQL 选择s.\U id 从…起 选择 数组\u按更新的集合顺序描述限制1[OFFSET0]为s 从'mytable'起,作为t 分组依据_id 不存在的地方 从UNNESTs.tags中选择1作为标记,其中的标记类似于“%query%”
我理解你的问题的方式是——为每个_id获取最新的条目,只输出那些没有标记查询的条目

下面是BigQuery的遗留SQL和标准SQL的版本

传统SQL:

legacySQL 选择_id 从…起 选择 _身份证, 比赛, 行号按id超额分配,订单按最新更新的描述 从…起 在记录中选择_id、updatedOn、sumtag(如“%query%”)作为匹配项 从[mytable] 其中匹配项=0 和最新=1 标准SQL:

标准SQL 选择s.\U id 从…起 选择 数组\u按更新的集合顺序描述限制1[OFFSET0]为s 从'mytable'起,作为t 分组依据_id 不存在的地方 从UNNESTs.tags中选择1作为标记,其中的标记类似于“%query%”