2014-07-01 31 views
3

我試圖使用定位功能,它似乎並不如預期的工作:BigQuery的位置功能

位置(場) - 返回一組重複的內場的基礎之一,順序位置領域。我希望位置在加載數據時給出原始位置,而我在結果集中獲得位置(即 - 在where子句運行之後)。

有沒有一種方法來獲取原始數據中的位置加載?

比較下面的兩個查詢來查看問題。

SELECT 
    ngram, 
    cell.value, 
    position(cell.volume_count) as pos, 
FROM [publicdata:samples.trigrams] 
where ngram contains ", says Blake" 

SELECT 
    ngram, 
    cell.value, 
    position(cell.volume_count) as pos, 
FROM [publicdata:samples.trigrams] 
where ngram contains ", says Blake" and integer(cell.value) % 5 = 0 

回答

2

問題是位置函數在where子句過濾嵌套值後得到評估。您可以使用嵌套查詢解決這個問題:

select 
    ngram, 
    value, 
    pos, 
from (
    select 
    ngram, 
    cell.value as value, 
    position(cell.volume_count) as pos, 
    from [publicdata:samples.trigrams] 
    where ngram contains ", says Blake" 
) 
where integer(cell.value) % 5 == 0 
+0

如何得到嵌套的記錄多級字段中的位置:選擇位置(repeatedRec.rec1.field),其中repeatedRec是重複記錄,並REC1是不重複的記錄?假設repeatRec沒有任何其他葉子。 – Lior

+0

我的一位同事指出,扁平化實際上並不是由where子句完成的;相反,問題在於操作的順序; where子句在位置函數之前被評估。要解決這個問題,你可以將where子句移動到外部選擇。我已經在上面更新了我的答案;它應該做你期望的。 –

+0

謝謝。是否有可能獲得嵌套在2級記錄中的字段的位置,其中只有最高級別是重複記錄? – Lior