2016-07-09 61 views
0

是否有可能在BigQuery查詢中查找匹配行之前和之後的行?例如,如果我這樣做:在BigQuery中查找匹配行的前面和後面的行?

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

,說我得到這些結果反饋:

something A 
something B 

我如何也顯示3行以下匹配的行?這樣的事情:

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 

這是可能的,如果是的話如何?

回答

1

雖然在祖馬海灘 - 我想在我的原始答案中避免CROSS JOIN。下面
檢查 - 應該是much cheaper尤其是對於大集

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 

當然另一種方式,以避免交叉連接是使用BigQuery的標準SQL。但仍然 - 以上解決方案沒有加入一切比我的原始答案更好

0

我認爲,你的例子中缺少一件 - 額外的字段,將定義順序,所以我在我的答案中添加了ts字段。這意味着我假設你的表格有兩個字段:textPayload和ts

請嘗試下面。應該給你什麼,你需要

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 

請注意:取決於你的類型TS字段的 - 你可能需要做一些數據查詢鑄造了這個領域。希望不是