Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编写SQL脚本,获取BigQuery中所有列的列表并将它们注入到查询中_Sql_Google Bigquery - Fatal编程技术网

编写SQL脚本,获取BigQuery中所有列的列表并将它们注入到查询中

编写SQL脚本,获取BigQuery中所有列的列表并将它们注入到查询中,sql,google-bigquery,Sql,Google Bigquery,我有一张这样的桌子: [ID] [Country_Region] [Date1] [Date2] [Date3] ... [Date150] [ID] [Country_Region] [Date.ColumnName] [Date.Value] ----------------------------------------------------- 1 China _1_22_20 12 2 China

我有一张这样的桌子:

[ID]  [Country_Region]  [Date1]  [Date2]  [Date3] ... [Date150]
[ID] [Country_Region] [Date.ColumnName] [Date.Value] 
-----------------------------------------------------
 1    China           _1_22_20           12
 2    China           _1_23_20           34
 [3   China           _1_24_20           54] <----- I want this row and all the next ones to appear as well
我在BigQuery中编写了一个SQL查询,返回如下数据集:

[ID]  [Country_Region]  [Date1]  [Date2]  [Date3] ... [Date150]
[ID] [Country_Region] [Date.ColumnName] [Date.Value] 
-----------------------------------------------------
 1    China           _1_22_20           12
 2    China           _1_23_20           34
 [3   China           _1_24_20           54] <----- I want this row and all the next ones to appear as well
我的SQL查询:

WITH timestamped_table AS 
(
    SELECT
        Country_Region,
        [STRUCT<timestamp STRING, timestamp_value INT64>
        ('2020-2-22', _2_22_20),
        ('2020-2-23', _2_23_20)] AS timestamp_data
    FROM
        `username.bq_timeseries_covid19.recovered_global` 
    WHERE
        Country_Region = 'China' AND Province_State = 'Zhejiang'
)
SELECT
    Country_Region, timestamp
FROM
    timestamped_table
CROSS JOIN
    UNNEST(timestamped_table.timestamp_data) AS timestamp
现在唯一的问题是我必须从查询中扩展这些行:

STRUCT<timestamp STRING, timestamp_value INT64>
        ('2020-2-22', _2_22_20),
        ('2020-2-23', _2_23_20)
以便它们包含所有日期列

如果我通过一些脚本来扩展它,我会想象它是这样的,我认为这不是最好的主意:

STRUCT<timestamp STRING, timestamp_value INT64>
        for column in get_date_columns():
        (timestamp_from_columnname(), column)

我认为编写SQL脚本/函数会更好,但我不知道如何从这一点开始,你需要明确列出列。但您不需要CTE:

SELECT rg.Country_Region, el.timestamp, el.timestamp_value
FROM `username.bq_timeseries_covid19.recovered_global` rg CROSS JOIN
     UNNEST([STRUCT<timestamp STRING, timestamp_value INT64>
             ('2020-2-22', _2_22_20),
             ('2020-2-23', _2_23_20)
            ]) el
WHERE rg.Country_Region = 'China' and
      rg.Province_State = 'Zhejiang';

实际上,使用JSON和字符串操作有一些技巧,但在我看来,这些技巧非常粗糙,不值得付出努力。

您需要明确列出这些列。但您不需要CTE:

SELECT rg.Country_Region, el.timestamp, el.timestamp_value
FROM `username.bq_timeseries_covid19.recovered_global` rg CROSS JOIN
     UNNEST([STRUCT<timestamp STRING, timestamp_value INT64>
             ('2020-2-22', _2_22_20),
             ('2020-2-23', _2_23_20)
            ]) el
WHERE rg.Country_Region = 'China' and
      rg.Province_State = 'Zhejiang';

实际上,使用JSON和字符串操作有一些技巧,但在我看来,这些技巧非常粗糙,不值得付出任何努力。

下面是BigQuery标准SQL,不要求您显式列出列,无论您有多少列—50、50或150—它应该可以工作,而不需要对下面的代码进行任何更改

#standardSQL
SELECT id, Country_Region, 
  STRUCT(
      SPLIT(kv,':')[OFFSET(0)] AS ColumnName, 
      SPLIT(kv,':')[OFFSET(1)] AS Value
  ) AS `Date`
FROM `project.dataset.table` t,
UNNEST(SPLIT(REGEXP_REPLACE(TO_JSON_STRING(t), '[{}"]', ''))) kv
WHERE SPLIT(kv,':')[OFFSET(0)] NOT IN ('id', 'Country_Region')
您可以使用下面的简化示例中的虚拟数据测试、播放上述内容

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 AS id, 'China' AS Country_Region, 12 AS _1_22_20, 34 AS _1_23_20, 54 AS _1_24_20 UNION ALL
  SELECT 2 AS id, 'Italy' AS Country_Region, 22 AS _1_22_20, 44 AS _1_23_20, 64 AS _1_24_20 
)
SELECT id, Country_Region, 
  STRUCT(
      SPLIT(kv,':')[OFFSET(0)] AS ColumnName, 
      SPLIT(kv,':')[OFFSET(1)] AS Value
  ) AS `Date`
FROM `project.dataset.table` t,
UNNEST(SPLIT(REGEXP_REPLACE(TO_JSON_STRING(t), '[{}"]', ''))) kv
WHERE SPLIT(kv,':')[OFFSET(0)] NOT IN ('id', 'Country_Region')
有输出

Row id  Country_Region  Date.ColumnName Date.Value   
1   1   China           _1_22_20        12   
2   1   China           _1_23_20        34   
3   1   China           _1_24_20        54   
4   2   Italy           _1_22_20        22   
5   2   Italy           _1_23_20        44   
6   2   Italy           _1_24_20        64   

下面是BigQuery标准SQL,不要求您显式列出列,无论您有多少列—50、50或150—它应该可以工作,而不需要对下面的代码进行任何更改

#standardSQL
SELECT id, Country_Region, 
  STRUCT(
      SPLIT(kv,':')[OFFSET(0)] AS ColumnName, 
      SPLIT(kv,':')[OFFSET(1)] AS Value
  ) AS `Date`
FROM `project.dataset.table` t,
UNNEST(SPLIT(REGEXP_REPLACE(TO_JSON_STRING(t), '[{}"]', ''))) kv
WHERE SPLIT(kv,':')[OFFSET(0)] NOT IN ('id', 'Country_Region')
您可以使用下面的简化示例中的虚拟数据测试、播放上述内容

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 AS id, 'China' AS Country_Region, 12 AS _1_22_20, 34 AS _1_23_20, 54 AS _1_24_20 UNION ALL
  SELECT 2 AS id, 'Italy' AS Country_Region, 22 AS _1_22_20, 44 AS _1_23_20, 64 AS _1_24_20 
)
SELECT id, Country_Region, 
  STRUCT(
      SPLIT(kv,':')[OFFSET(0)] AS ColumnName, 
      SPLIT(kv,':')[OFFSET(1)] AS Value
  ) AS `Date`
FROM `project.dataset.table` t,
UNNEST(SPLIT(REGEXP_REPLACE(TO_JSON_STRING(t), '[{}"]', ''))) kv
WHERE SPLIT(kv,':')[OFFSET(0)] NOT IN ('id', 'Country_Region')
有输出

Row id  Country_Region  Date.ColumnName Date.Value   
1   1   China           _1_22_20        12   
2   1   China           _1_23_20        34   
3   1   China           _1_24_20        54   
4   2   Italy           _1_22_20        22   
5   2   Italy           _1_23_20        44   
6   2   Italy           _1_24_20        64   

您需要显式列出列。您需要显式列出列。