2017-03-06 2 views
0

を添付しなければならない:GROUP_CONCATは分析関数であると私は、次のようBigQueryのレガシーSQLを使用してクエリしようとしているOVER句

それが更新されたときに、テーブル内のデータが追加されるので、最初に私が行う必要があるが私は後にクエリーの内部で最新の更新された情報のサブセレクト(MAX(updatedOnを使用))を使用します。 タグは繰り返しフィールドで、文字列値を使用します。

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)')) 

TAGSを繰り返しフィールドであると私は、タグクエリを持っていないユーザーを選択しようとしています。

私はGROUP_CONCATを使用していない場合は(あなたが繰り返しフィールドを持っているときにBigQueryは、複数の行を返すため)、彼らは少なくとも一つの他のタグを持っている場合、ユーザーが持っている場合はそれもそう

をqueryタグを持つユーザーを検索します"x"と "query"タグがこのクエリによって返されます(私はしたくありません)。 しかし、返されない場合には、ユーザーには "query"タグしかありません。

うまくいけば、私は十分に分かりました。 私はflatten(mytable、tags)と同じ結果を試しました。

ありがとうございます。

答えて

0

MAXの代わりに、別の方法を使って最新の行を取得することができます。私たちはこの設定をビューとして持っています。必要に応じて調整します。私の例ではservicesが繰り返しフィールド

0

ここでそれはとARRAY_AGGを使用してこれを表現する方が簡単です

where NOT services contains 'Google' 

:として何かを含まない従来のSQL行に取得する

#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 

は簡単です。 ORDER BYおよびLIMITを使用する。standard SQL。このパターンを使用すると、最新のupdatedOnに関連付けられた行を選択できます。例えば、ここで

#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 
); 
0

方法 - 各_idと出力のための最新のエントリを取るだけでそうでない人以下のBigQueryの遺産SQLと標準SQL

レガシーの両方のバージョンがあるタグ「クエリ」

を持っていますSQL:

#legacySQL 
SELECT _id 
FROM (
    SELECT 
    _id, 
    matches, 
    ROW_NUMBER() OVER(PARTITION BY _id ORDER BY updatedOn DESC) AS latest 
    FROM (
    SELECT _id, updatedOn, SUM(tags LIKE '%query%') WITHIN RECORD AS matches 
    FROM [mytable] 
) 
) 
WHERE matches = 0 
AND latest = 1 

標準SQL:

#standardSQL 
SELECT s._id 
FROM (
    SELECT 
    ARRAY_AGG(t ORDER BY updatedOn DESC LIMIT 1)[OFFSET(0)] AS s 
    FROM `mytable` AS t 
    GROUP BY _id 
) 
WHERE NOT EXISTS (
    SELECT 1 FROM UNNEST(s.tags) AS tag WHERE tag LIKE '%query%' 
) 
関連する問題