2017-06-21 41 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 - 最有可能不是您所需要的。同时 - 摆动也很容易实现(如果你有一些有限的字段值),你可以找到很多相关的帖子