2017-06-21 40 views
0

我的分析涉及需要聚合行並在所有行中存儲字段someField的不同值出現次數。地圖結構的地理對等

樣本數據結構 [someField, someKey]

我想GROUP BY someKey,然後就能知道每個結果多少時間有每個someField

例:

[someField: a, someKey: 1], 
[someField: a, someKey: 1], 
[someField: b, someKey: 1], 
[someField: c, someKey: 2], 
[someField: d, someKey: 2] 

我想實現什麼:

[someKey: 1, fields: {a: 2, b: 1}], 
[someKey: 2, fields: {c: 1, d: 1}], 
+0

重要的是 - 你可以用左邊的勾號來標記接受的答案發布的答案,低於投票。請參閱http://meta.stackexchange。com/questions/5234/how-does-accepting-an-answer-work#5235爲什麼它很重要!對答案投票也很重要。表決有用的答案。 ...當某人回答你的問題時,你可以檢查該怎麼做 - http://stackoverflow.com/help/someone-answers。遵循這些簡單的規則,您可以提高自己的聲譽得分,同時讓我們有動力回答您的問題:o)請考慮! –

+0

對不起,我忘記了這個 –

回答

2

它適合你嗎?

WITH data AS (
    select 'a' someField, 1 someKey UNION all 
    select 'a', 1 UNION ALL 
    select 'b', 1 UNION ALL 
    select 'c', 2 UNION ALL 
    select 'd', 2) 

SELECT 
    someKey, 
    ARRAY_AGG(STRUCT(someField, freq)) fields 
FROM(
    SELECT 
    someField, 
    someKey, 
    COUNT(someField) freq 
    FROM data 
    GROUP BY 1, 2 
) 
GROUP BY 1 

結果:

enter image description here

它不會給確切你正在尋找的結果,但它可能工作得到同樣的查詢以前的結果會。如您所說,對於每個key,您可以檢索多少次(列freqsomeField發生。

我一直在尋找關於如何聚合結構並找不到的方法。但是以STRUCTS的ARRAY作爲檢索結果的結果非常簡單。

1

有可能是一個更聰明的方法來做到這一點(並得到它想要的格式,例如使用第2列的陣列),但是這可能會爲你足夠:

with sample as (
select 'a' as someField, 1 as someKey UNION all 
select 'a' as someField, 1 as someKey UNION ALL 
select 'b' as someField, 1 as someKey UNION ALL 
select 'c' as someField, 2 as someKey UNION ALL 
select 'd' as someField, 2 as someKey) 

SELECT 
    someKey, 
    SUM(IF(someField = 'a', 1, 0)) AS a, 
    SUM(IF(someField = 'b', 1, 0)) AS b, 
    SUM(IF(someField = 'c', 1, 0)) AS c, 
    SUM(IF(someField = 'd', 1, 0)) AS d 
FROM 
    sample 
GROUP BY 
    someKey order by somekey asc 

結果:BigQuery中的

someKey a b c d 
---------------------  
    1  2 1 0 0  
    2  0 0 1 1 

這是很好用的技術(見here)。

+0

a,b,c和d鍵可能是無限的,並且在開始時是未知的,我可以假設字段名稱爲 –

+0

對於未知的鍵仍有可能。您首先運行查詢以生成SQL。看到這裏 - > https://stackoverflow.com/questions/34010002/how-to-create-dummy-variable-columns-for-thousands-of-categories-in-google-bigqu/34010803#34010803 –

0

我想GROUP BY someKey然後就能知道每個結果多少時間有每個someField值

#standardSQL 
SELECT 
    someKey, 
    someField, 
    COUNT(someField) freq 
FROM yourTable 
GROUP BY 1, 2 
-- ORDER BY someKey, someField 

我想什麼以實現:
[someKey:1,字段:{a:2,b:1}],
[someKey:2,字段:{c:1,d:1}],

這與您在文字中表達的內容不同 - 它被稱爲pivoting並基於您的評論 - The a, b, c, and d keys are potentially infinite - 最有可能不是您所需要的。同時 - 擺動也很容易實現(如果你有一些有限的字段值),你可以找到很多相關的帖子