2016-07-09 13 views
0

Ist es möglich, Zeilen vor und nach einer übereinstimmenden Zeilen in einer BigQuery-Abfrage zu finden? wenn ich zum Beispiel so tun:Suchen Sie in BigQuery nach den vorherigen und folgenden Zeilen für eine übereinstimmende Zeile?

select textPayload from logs.logs_20160709 where textPayload like "%something%" 

und sagen, dass ich diese Ergebnisse zurück:

something A 
something B 

Wie kann ich zeigen auch die drei Reihen vorhergehenden und folgende die passenden Zeilen? Etwas wie dieses:

some text 1 
some text 2 
some text 3 
something A 
some text 4 
some text 5 
some text 6 
some text 90 
some text 91 
some text 92 
something B 
some text 93 
some text 94 
some text 95 

Ist das möglich und wenn ja wie?

Antwort

1

Während auf Zuma Beach - ich dachte daran, CROSS JOIN in meiner ursprünglichen Antwort zu vermeiden.
prüfen unten - sollte much cheaper besonders für große Menge

SELECT textPayload 
FROM (
    SELECT textPayload, 
    SUM(match) OVER(ORDER BY ts ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING) AS flag 
    FROM (
    SELECT textPayload, ts, IF(textPayload CONTAINS 'something', 1, 0) AS match 
    FROM YourTable 
) 
) 
WHERE flag > 0 

Natürlich eine andere Art und Weise sein Kreuz zu vermeiden verbinden ist BigQuery Standard-SQL zu verwenden. Aber immer noch - über Lösung mit keine Verbindungen ist besser als meine ursprüngliche Antwort

0

Ich denke, ein Stück fehlt in Ihrem Beispiel - extra Feld, das die Reihenfolge definieren wird, so fügte ich ts Feld dafür in meiner Antwort. Dies bedeutet, ich nehme an, Ihre Tabelle hat zwei Felder beteiligt: ​​textPayload und ts

Versuchen Sie unten. Sollten Sie genau das, was Sie

SELECT 
    all.textPayload 
FROM (
    SELECT start, finish 
    FROM (
    SELECT textPayload, 
     LAG(ts, 3) OVER(ORDER BY ts ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS start, 
     LEAD(ts, 3) OVER(ORDER BY ts ROWS BETWEEN CURRENT ROW AND 3 FOLLOWING) AS finish 
    FROM YourTable 
) 
    WHERE textPayload CONTAINS 'something' 
) AS matches 
CROSS JOIN YourTable AS all 
WHERE all.ts BETWEEN matches.start AND matches.finish 

benötigen Bitte beachten Sie: je nach Art Ihrer ts Feld - Sie müssen möglicherweise einige Daten Gießen in Abfrage für dieses Feld zu tun. hoffe nicht