динамически поворачивать строки в столбцы в красном смещении - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть таблица Redshift с различными делами, компанией и датой (отметка времени)

Я использовал следующий запрос для агрегирования количества дел на компанию по месяцам:

      SELECT
    DATE_TRUNC('MONTH', case_date) AS month,
    company_id,
    COUNT(DISTINCT case_number)      AS case_count
  FROM case
  WHERE case_date >= '2017-01-01'
  AND case_date < DATE_TRUNC('MONTH', CURRENT_DATE)
  GROUP BY 1, 2
  ORDER BY 1

И получил:

month                  company_id       case_count
2017-01-01 00:00:00     5786            4
2017-01-01 00:00:00     8681            1
.........               ....         .....
2018-08-01              ....         .....      

Я хочу развернуть таблицу по компании.Желательно, чтобы каждая компания была в строке, а столбцы - каждый месяц с 2017-01-01 по предыдущий месяц текущей даты.Так это будет выглядеть так:

  company_id   2017-01-01_case_count  2017-02-01_case_count  .. 2018-08-01..
    5786          4                        7

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

Я, конечно, могу выгрузить все данные в Python и сделать это, но я хочурешить проблему в Redshift.

1 Ответ

0 голосов
/ 22 сентября 2018

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

Это необходимо, потому чтоСтруктура SQL требует, чтобы запросы / наборы данных имели фиксированные подписи (имена столбцов, типы данных и т. Д.), А не динамические (не существует нативного SQL, который делает то, что вы просите) .Что нормально с нормализованными структурами, такими как вы начинаете.

Это также означает, что SQL не обычно является подходящим местом для переформатирования ваших данных для представления вчеловек.Это то, что должен делать ваш уровень представления.

В вашем случае, похоже, вы знаете столбцы, которые вам нужны из параметров в вашем предложении WHERE.Это означает, что ваш питон может писать динамический SQL только из этих параметров ...

SELECT
  company_id,
  COUNT(DISTINCT CASE WHEN case_date >= '2017-01-01' AND case_date < '2017-02-01' THEN case_number END)   AS 201701_case_count,
  COUNT(DISTINCT CASE WHEN case_date >= '2017-02-01' AND case_date < '2017-03-01' THEN case_number END)   AS 201702_case_count,
  ...
  COUNT(DISTINCT CASE WHEN case_date >= '2018-09-01' AND case_date < '2018-10-01' THEN case_number END)   AS 201809_case_count
FROM
  case
WHERE
      case_date >= '2017-01-01'
  AND case_date <  DATE_TRUNC('MONTH', CURRENT_DATE)
GROUP BY
  company_id

Теперь, если вы должны , это другой вопрос.

...