合并三个大查询表

时间:2019-11-15 16:14:09

标签: sql google-bigquery

我已将Google Analytics(分析)中的数据提取到几个Big Query表中。 Google Analytics(分析)将维度数限制为7,将指标数限制为10。

我有三个表,每个表都具有相同的7个维度。我总共有30个指标(每个表中有10个指标)。

如何将这些表合并为一个表? JOIN或UNION似乎不是执行此操作的正确方法,因为所有“维度”都具有相同的名称,并且我不想添加其他行。基本上只是根据维度“键”向第一张表添加20列?

2 个答案:

答案 0 :(得分:1)

如果我了解您的要求,您将具有以下条件:

表1(这里只有3个样本,而不是10个):

SELECT 'metric_name_1' as metric_name, 
       'val_1' as dim_1, 
       'val_2' as dim_2, 
       'val_3' as dim_3,
       'val_4' as dim_4, 
       'val_5' as dim_5, 
       'val_6' as dim_6, 
       'val_7' as dim_7
 UNION ALL 
 SELECT 'metric_name_2', 
        'val_8', 
        'val_9',
        'val_10', 
        'val_11', 
        'val_12', 
        'val_13', 
        'val_14'
 UNION ALL 
 SELECT 'metric_name_3',
        'val_15',
        'val_16', 
        'val_17', 
        'val_18', 
        'val_19',
        'val_20',
        'val_21'

First table screenshot

第二张表:

SELECT 'metric_name_4' as metric_name, 
       'val_22' as dim_1, 
       'val_23' as dim_2, 
       'val_24' as dim_3,
       'val_25' as dim_4, 
       'val_26' as dim_5, 
       'val_27' as dim_6, 
       'val_28' as dim_7
UNION ALL 
SELECT 'metric_name_5', 
       'val_29', 
       'val_30',
       'val_31', 
       'val_32', 
       'val_33', 
       'val_34', 
       'val_35'
UNION ALL 
SELECT 'metric_name_6',
       'val_36',
       'val_37', 
       'val_38', 
       'val_39', 
       'val_40',
       'val_41',
       'val_42'

Second table screenshot

然后,您要接收一个像这样的表:

Resulting table

这不是很琐碎,可以通过两个步骤实现:

resulting_join as (select first_table,second_table  from first_table join second_table on True)
SELECT * EXCEPT (pos, pos_1)
FROM (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY first_table.metric_name) AS pos, 
            ROW_NUMBER() OVER (PARTITION BY second_table.metric_name) AS pos_1,
  FROM resulting_join
)
WHERE pos = pos_1

我认为在这种情况下最好使用UNION ALL并添加新行。希望对您有所帮助-如果您需要进一步的解释-我们很乐意回答。

答案 1 :(得分:0)

我认为您想要import SwiftUI struct UserDefault<T> { let key: String let defaultValue:T var wrappedValue:T { get { return UserDefaults.standard.object(forKey: key) as? T ?? defaultValue } set { UserDefaults.standard.set(newValue, forKey: key) } } }

import SwiftUI
import Combine

final class DataStore : ObservableObject { //(1)
    let didChange = PassthroughSubject<DataStore, Never>()

    @UserDefault(key: "firstLaunch", defaultValue: true) //(2)
    var firstLaunch:Bool{
        didSet{
            didChange.send(self)
        }
    }
}

这假定度量标准具有不同的名称,并且表仅具有维度和度量标准。

如果所有表格的尺寸均相同,则可以改用full join