Как создать сводную таблицу PostgreSQL, которая объединяет несколько столбцов? - PullRequest
1 голос
/ 23 сентября 2019

Я изучал функцию crosstab() в модуле расширения tablefunc PostgreSQL как способ создания сводных таблиц.

Это здорово, но, кажется, подходит только для самых простых вариантов использования.Обычно он поддерживает только ТРИ столбца ввода:

  1. Столбец значений, которые остаются неизменными, в качестве меток строк
  2. Столбец значений, которые поворачиваются, чтобы стать именами новых столбцов
  3. Столбец значений, которые становятся значениями для их соответствующих новых столбцов сводных данных

В основном взяв это:

+------+----------+-------+
| 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 |
+------+--------+--------+----------+

Но как насчет более сложных вариантов использования?Что если у вас есть:

  1. МНОГОКРАТНЫЕ входные столбцы, которые вы хотели бы оставить на выходе как есть?
  2. МНОЖЕСТВЕННЫЕ входные столбцы, которые вы хотели бы развернуть в новые столбцы?

Как в примере ниже:

+--------+-----------------+---------+--------+-------+------------------+
| 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?Спасибо!

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Вы можете попробовать использовать агрегированное агрегирование

select system,MICROSERVICE , MONTH,
max(case when METRIC='uptime' then VALUE end) as uptime_value,
max(case when METRIC='uptime' then CONFIDENCE_LEVEL end) as uptime_confidence,
max(case when METRIC='lag' then VALUE end) as lag_value,
max(case when METRIC='lag' then CONFIDENCE_LEVEL end) as lag_confidence
from tablename
group by system,MICROSERVICE , MONTH
0 голосов
/ 23 сентября 2019

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

...