Борьба с поворотом набора данных из строк в столбцы - PullRequest
0 голосов
/ 22 марта 2011

У меня есть набор данных, в котором есть несколько записей, представляющих различные характеристики для одних и тех же объектов.

Пример:

DEVICE  METRIC           SCORE   WHEN
-------------------------------------------------
devA    reads_per_sec    100    2011-03-01 12:00:00 AM
devA    writes_per_sec   50     2011-03-01 12:00:00 AM
devA    total_per_sec    150    2011-03-01 12:00:00 AM
devB    reads_per_sec    200    2011-03-01 12:00:00 AM
devB    writes_per_sec   50     2011-03-01 12:00:00 AM
devB    total_per_sec    250    2011-03-01 12:00:00 AM
devC    reads_per_sec    300    2011-03-01 12:00:00 AM
...

Я хочу перевести все из этой таблицы в новую таблицу с такой структурой

DEVICE  READS  WRITES  TOTAL  WHEN
--------------------------------------------------
devA    100    50      150    2011-03-01 12:00:00 AM
devB    200    50      250    2011-03-01 12:00:00 AM
devC    300    50      150    2011-03-01 12:00:00 AM
...

У меня есть более десятка «метрик» для каждого из тысяч устройств из тысяч временных отметок.

Будет гораздо проще запросить, чтобы увидеть все метрические оценки для данного устройства в данное время, если я смогу просмотреть одну запись для устройства для каждого периода выборки.

Итак, мой вопрос: как лучше всего подойти к этому и выполнить его? Я не хочу просить кого-либо сделать мою работу за меня, но это за пределами моих знаний о базах данных.

1 Ответ

3 голосов
/ 22 марта 2011

Будет воспроизведен ожидаемый результат, который вы перечислили:

  SELECT t.device,
         SUM(CASE WHEN t.metric = 'reads_per_sec' THEN t.score ELSE 0 END) AS reads,
         SUM(CASE WHEN t.metric = 'writes_per_sec' THEN t.score ELSE 0 END) AS writes,
         SUM(CASE WHEN t.metric = 'total_per_sec' THEN t.score ELSE 0 END) AS total,
         t.when
    FROM YOUR_TABLE t
GROUP BY t.device, t.when
ORDER BY t.device, t.when

Если вам нужно работать с различными метриками, вам, вероятно, придется использовать динамический SQL .Вам необходимо получить уникальный список значений метрики (если только у вас нет таблицы кодов типов для ссылки на внешний ключ):

SELECT DISTINCT t.metric
  FROM YOUR_TABLE t

Затем объедините SUM(CASE ... для каждой метрики перед выполнением запроса..

...