BigQuery: запрос повторяющихся полей с перекрестной ссылкой - PullRequest
0 голосов
/ 04 июля 2018

Я унаследовал таблицу BigQuery с несколько необычной схемой:

[
  { "name":"hardware_id", "type":"STRING", "mode":"NULLABLE" },
  { "name":"manufacturer", "type":"STRING", "mode":"NULLABLE" },
  { "name":"model", "type":"STRING", "mode":"NULLABLE" },
  { "fields":[
    { "name":"brand", "type":"STRING", "mode":"REPEATED" },
    { "name":"model_name", "type":"STRING", "mode":"NULLABLE" }
  ], "name":"components", "type":"RECORD", "mode":"REPEATED" },
  { "name":"ram", "type":"INTEGER", "mode":"NULLABLE" },
  { "name":"hdd", "type":"INTEGER", "mode":"NULLABLE" }
]

Данные структурированы так:

hw_id | manufacturer | model | components.type | components.model_name | ram |  hdd
------+--------------+-------+-----------------+-----------------------+-----+-----
    1 |       Lenovo |   ABX |             GPU |           Radeon 5500 |  16 | 1000
      |              |       |             CPU |               Core i7 |     |
      |              |       | SCSI Controller |          Adaptec 2940 |     |
------+--------------+-------+-----------------+-----------------------+-----+-----
    2 |         Dell |   ZXV |             CPU |               Core i7 |   4 |  500
      |              |       |             GPU |               GeForce |     |
      |              |       |           Sound |          SoundBlaster |     |
------+--------------+-------+-----------------+-----------------------+-----+-----
    3 |          IBM |  PS/2 |             CPU |                  i386 |   1 |  100
      |              |       |           Sound |          SoundBlaster |     |
      |              |       |             GPU |               GeForce |     |

Я хочу запросить несколько компонентов одновременно, например, найти все оборудование с процессором Core i7 и звуковой картой SoundBlaster. К сожалению, поля «компоненты» не находятся в согласованном порядке, а «имя_модели» может быть неоднозначным, поэтому мне нужно также запросить соответствующее поле «бренд».

Я могу создать запрос для одного компонента, но еще не для нескольких компонентов одновременно. Можете ли вы намекнуть мне в правильном направлении?

1 Ответ

0 голосов
/ 04 июля 2018

Ниже для BigQuery Standard SQL

#standardSQL
SELECT *
FROM `project.dataset.table`
WHERE 2 = 
  (SELECT COUNT(1) 
    FROM UNNEST(components) 
    WHERE (type, model_name) IN (
      ('Sound', 'SoundBlaster'), ('CPU', 'Core i7')
    )
  )

Вы можете проверить, поиграть с выше, используя фиктивные данные из вашего вопроса, как показано ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 hw_id, 'Lenovo' manufacturer, 'ABX' model, [STRUCT<type STRING, model_name STRING>('GPU', 'Radeon 5500'), ('CPU', 'Core i7'), ('SCSI Controller', 'Adaptec 2940')] components, 16 ram, 1000 hdd UNION ALL
  SELECT 2, 'Dell', 'ZXV', [('CPU', 'Core i7'), ('GPU', 'GeForce'), ('Sound', 'SoundBlaster')], 4, 500 UNION ALL
  SELECT 3, 'IBM', 'PS/2', [('CPU', 'i386'), ('Sound', 'SoundBlaster'), ('GPU', 'GeForce')], 1, 100 
)
SELECT *
FROM `project.dataset.table`
WHERE 2 = 
  (SELECT COUNT(1) 
    FROM UNNEST(components) 
    WHERE (type, model_name) IN (
      ('Sound', 'SoundBlaster'), ('CPU', 'Core i7')
    )
  )

так что результат будет

hw_id | manufacturer | model | components.type | components.model_name | ram |  hdd
------+--------------+-------+-----------------+-----------------------+-----+-----
    2 |         Dell |   ZXV |             CPU |               Core i7 |   4 |  500
      |              |       |             GPU |               GeForce |     |
      |              |       |           Sound |          SoundBlaster |     |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...