У меня есть таблица в BigQuery, которая показывает данные в следующей структуре:
+------------+---------+-----------+-----------+
| Date | Product | CostPrice | SalePrice |
+------------+---------+-----------+-----------+
| 01/01/2018 | hat | 10 | 20 |
| 01/01/2018 | shoe | 5 | 12 |
| 01/02/2018 | hat | 11 | 22 |
| 01/02/2018 | shoe | 6 | 13 |
+------------+---------+-----------+-----------+
Я хочу сгладить (это правильная терминология?) Данные, чтобы каждая строка имела только одну метрику. Это, очевидно, требует наличия столбца для MetricName, чтобы определить, какие показатели из первой таблицы предоставляются в каждой строке.
+------------+-------------+------------+-------------+
| Date | Product | MetricName | MetricValue |
+------------+-------------+------------+-------------+
| 01/01/2018 | hat | CostPrice | 10 |
| 01/01/2018 | hat | SalePrice | 20 |
| 01/01/2018 | shoe | CostPrice | 5 |
| 01/01/2018 | shoe | SalePrice | 12 |
| 01/02/2018 | hat | CostPrice | 11 |
| 01/02/2018 | hat | SalePrice | 22 |
| 01/02/2018 | shoe | CostPrice | 6 |
| 01/02/2018 | shoe | SalePrice | 13 |
+------------+-------------+------------+-------------+
Я не уверен, как создать SQL-запрос, который позволил бы достичь этого?
Спасибо,
J.Ayo


Ниже приведен стандартный SQL BigQuery.
#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)])
Спасибо за редактирование, Йогеш. Как вы так быстро изменили ASCII? Есть ли инструмент, который может это сделать?