Создайте представление в BigQuery, которое выравнивает таблицу

Чтобы расширить ответ на зомбат (который, я считаю, лучшим ответом), я создал рекурсивную версию его функции, которая принимает параметр $limit, чтобы указать, сколько вхождений вы хотите заменить.

function str_replace_limit($haystack, $needle, $replace, $limit, $start_pos = 0) {
    if ($limit <= 0) {
        return $haystack;
    } else {
        $pos = strpos($haystack,$needle,$start_pos);
        if ($pos !== false) {
            $newstring = substr_replace($haystack, $replace, $pos, strlen($needle));
            return str_replace_limit($newstring, $needle, $replace, $limit-1, $pos+strlen($replace));
        } else {
            return $haystack;
        }
    }
}
0
задан J. Ayo 13 July 2018 в 13:04
поделиться

1 ответ

Ниже для стандарта BigQuery Standard SQL

#standardSQL
SELECT Date, Product, 'CostPrice' AS MetricName, CostPrice AS MetricValue
FROM `project.dataset.table` UNION ALL
SELECT Date, Product, 'SalePrice' AS MetricName, SalePrice AS MetricValue
FROM `project.dataset.table`    

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

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '01/01/2018' Date, 'hat' Product, 10 CostPrice, 20 SalePrice UNION ALL
  SELECT '01/01/2018', 'shoe', 5, 12 UNION ALL
  SELECT '01/02/2018', 'hat', 11, 22 UNION ALL
  SELECT '01/02/2018', 'shoe', 6, 13 
)
SELECT Date, Product, 'CostPrice' AS MetricName, CostPrice AS MetricValue
FROM `project.dataset.table` UNION ALL
SELECT Date, Product, 'SalePrice', SalePrice
FROM `project.dataset.table`   

Другой вариант, чтобы избежать использования UNION ALL (поскольку он требует некоторого избыточного кода), как показано ниже

#standardSQL
SELECT DATE, Product, MetricName, MetricValue
FROM `project.dataset.table`,
UNNEST([STRUCT<MetricName STRING, MetricValue INT64>
  ('CostPrice', CostPrice), ('SalePrice', SalePrice)])
4
ответ дан Mikhail Berlyant 17 August 2018 в 12:47
поделиться
  • 1
    Спасибо, что работает отлично, и так просто – J. Ayo 13 July 2018 в 13:43
Другие вопросы по тегам:

Похожие вопросы: