Я изучал функцию crosstab()
в модуле расширения tablefunc
PostgreSQL как способ создания сводных таблиц.
Это здорово, но, кажется, подходит только для самых простых вариантов использования.Обычно он поддерживает только ТРИ столбца ввода:
- Столбец значений, которые остаются неизменными, в качестве меток строк
- Столбец значений, которые поворачиваются, чтобы стать именами новых столбцов
- Столбец значений, которые становятся значениями для их соответствующих новых столбцов сводных данных
В основном взяв это:
+------+----------+-------+
| ITEM | STATUS | COUNT |
+------+----------+-------+
| foo | active | 12 |
| foo | inactive | 17 |
| bar | active | 20 |
| bar | inactive | 4 |
+------+----------+-------+
... и произведя это:
+------+--------+--------+----------+
| ITEM | STATUS | ACTIVE | INACTIVE |
+------+--------+--------+----------+
| foo | active | 12 | 17 |
| bar | active | 20 | 4 |
+------+--------+--------+----------+
Но как насчет более сложных вариантов использования?Что если у вас есть:
- МНОГОКРАТНЫЕ входные столбцы, которые вы хотели бы оставить на выходе как есть?
- МНОЖЕСТВЕННЫЕ входные столбцы, которые вы хотели бы развернуть в новые столбцы?
Как в примере ниже:
+--------+-----------------+---------+--------+-------+------------------+
| SYSTEM | MICROSERVICE | MONTH | METRIC | VALUE | CONFIDENCE_LEVEL |
+--------+-----------------+---------+--------+-------+------------------+
| batch | batch-processor | 2019-01 | uptime | 99 | 2 |
| batch | batch-processor | 2019-01 | lag | 20 | 1 |
| batch | batch-processor | 2019-02 | uptime | 97 | 2 |
| batch | batch-processor | 2019-02 | lag | 35 | 2 |
+--------+-----------------+---------+--------+-------+------------------+
Где первые три столбца должны переноситься как есть для каждой строки (без группировки или агрегирования).И столбец metric
имеет два связанных столбца (т. Е. value
и confidence_level
) для его поворота?
+--------+-----------------+---------+--------------+-------------------+-----------+----------------+
| SYSTEM | MICROSERVICE | MONTH | UPTIME_VALUE | UPTIME_CONFIDENCE | LAG_VALUE | LAG_CONFIDENCE |
+--------+-----------------+---------+--------------+-------------------+-----------+----------------+
| batch | batch-processor | 2019-01 | 99 | 2 | 20 | 1 |
| batch | batch-processor | 2019-02 | 97 | 2 | 35 | 2 |
+--------+-----------------+---------+--------------+-------------------+-----------+----------------+
Я не уверен, соответствует ли это строгому определению "сводной таблицы"».Но возможен ли такой результат с crosstab()
или любой другой доступной функцией PostgreSQL?Если нет, то как это можно сделать с помощью пользовательской функции PL / pgSQL?Спасибо!