使用 Big Query,如何在一条记录中查询多个对象?
Using Big Query, how can I query within a record for multiple objects?
下面是我正在使用的结构。这是来自 firebase 的 Google 分析事件。
我需要 AND
遍历参数数组并且 return 只有一个参数值具有 'eventData' 的键。同时,我需要通过在同一参数数组中找到的其他两个对象(具有 'peripheral' 和 'eventType' 的键值)来限制查询。
我正在使用 Legacy SQL 但愿意使用其他软件。我查看并使用了 FLATTEN,但最终似乎并没有给我想要的东西。
查询示例可能更有意义。
SELECT event_dim.params.value.int_value -- this needs to come from the eventData object
FROM
[table]
where event_dim.name = 'EPILOG_BAT'
AND event_dim.timestamp_micros > 1529423373498009
-- AND event_dim.params contains (key='peripheral', string_value = 'CA5D6D4C-9B4C-9BB1-03CF-5A8BCD7651FE')
-- AND event_dim.params contains (key='eventType', string_value = 'V')
order by event_dim.timestamp_micros ,
event_dim.params.key
我希望得到的行是
4105
数据:
"event_dim": [
{{
"date": "20180620",
"name": "EPILOG_BAT",
"params": [
{
"key": "eventData",
"value": {
"string_value": null,
"int_value": "4105",
"float_value": null,
"double_value": null
}
},
{
"key": "peripheral",
"value": {
"string_value": "CA5D6D4C-9B4C-9BB1-03CF-5A8BCD7651FE",
"int_value": null,
"float_value": null,
"double_value": null
}
},
{
"key": "eventTime",
"value": {
"string_value": null,
"int_value": "1529499380000",
"float_value": null,
"double_value": null
}
},
{
"key": "eventType",
"value": {
"string_value": "V",
"int_value": null,
"float_value": null,
"double_value": null
}
},
{
"key": "firmwareVersion",
"value": {
"string_value": "0.8.6\u0000\u0000\u0000\u0000\u0000\u0000\u0000",
"int_value": null,
"float_value": null,
"double_value": null
}
}
],
"timestamp_micros": "1529478561132285",
"previous_timestamp_micros": "1529478560856003",
"value_in_usd": null
},}
可能是这样的(请原谅我的格式):
#standardSql
SELECT
(SELECT params.value.int_value FROM event.params WHERE params.key =
'eventData') AS id
FROM `data_source`,
UNNEST(event_dim) AS event,
UNNEST(event.params) AS params
WHERE event.name = 'EPILOG_BAT'
AND event_dim.timestamp_micros > 1529423373498009
AND (SELECT params.value.string_value FROM event.params WHERE params.key =
'peripheral') = 'CA5D6D4C-9B4C-9BB1-03CF-5A8BCD7651FE'
AND (SELECT params.value.string_value FROM event.params WHERE params.key =
'eventType') = 'V'
下面是我正在使用的结构。这是来自 firebase 的 Google 分析事件。
我需要 AND
遍历参数数组并且 return 只有一个参数值具有 'eventData' 的键。同时,我需要通过在同一参数数组中找到的其他两个对象(具有 'peripheral' 和 'eventType' 的键值)来限制查询。
我正在使用 Legacy SQL 但愿意使用其他软件。我查看并使用了 FLATTEN,但最终似乎并没有给我想要的东西。 查询示例可能更有意义。
SELECT event_dim.params.value.int_value -- this needs to come from the eventData object
FROM
[table]
where event_dim.name = 'EPILOG_BAT'
AND event_dim.timestamp_micros > 1529423373498009
-- AND event_dim.params contains (key='peripheral', string_value = 'CA5D6D4C-9B4C-9BB1-03CF-5A8BCD7651FE')
-- AND event_dim.params contains (key='eventType', string_value = 'V')
order by event_dim.timestamp_micros ,
event_dim.params.key
我希望得到的行是 4105
数据:
"event_dim": [
{{
"date": "20180620",
"name": "EPILOG_BAT",
"params": [
{
"key": "eventData",
"value": {
"string_value": null,
"int_value": "4105",
"float_value": null,
"double_value": null
}
},
{
"key": "peripheral",
"value": {
"string_value": "CA5D6D4C-9B4C-9BB1-03CF-5A8BCD7651FE",
"int_value": null,
"float_value": null,
"double_value": null
}
},
{
"key": "eventTime",
"value": {
"string_value": null,
"int_value": "1529499380000",
"float_value": null,
"double_value": null
}
},
{
"key": "eventType",
"value": {
"string_value": "V",
"int_value": null,
"float_value": null,
"double_value": null
}
},
{
"key": "firmwareVersion",
"value": {
"string_value": "0.8.6\u0000\u0000\u0000\u0000\u0000\u0000\u0000",
"int_value": null,
"float_value": null,
"double_value": null
}
}
],
"timestamp_micros": "1529478561132285",
"previous_timestamp_micros": "1529478560856003",
"value_in_usd": null
},}
可能是这样的(请原谅我的格式):
#standardSql
SELECT
(SELECT params.value.int_value FROM event.params WHERE params.key =
'eventData') AS id
FROM `data_source`,
UNNEST(event_dim) AS event,
UNNEST(event.params) AS params
WHERE event.name = 'EPILOG_BAT'
AND event_dim.timestamp_micros > 1529423373498009
AND (SELECT params.value.string_value FROM event.params WHERE params.key =
'peripheral') = 'CA5D6D4C-9B4C-9BB1-03CF-5A8BCD7651FE'
AND (SELECT params.value.string_value FROM event.params WHERE params.key =
'eventType') = 'V'