PostgreSQL Crosstab: строки месяца и столбцы дня;Ошибка типа данных rowid не совпадает с возвращаемым типом данных rowid - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь создать таблицу кросс-таблицы, в которой будут строки = месяцы и столбцы = дни (т. Е. 1, 2, 3, 4 ... 31).

    Month |   1  |   2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |  10  | 11  |  12 ...
    ------+------+------+-----+-----+-----+-----+-----+-----+-----+-----+------+------
     9    | 1000 | 1500 |     |     |     |     | 500 |     |     |     | 1500 | 2000
     8    | 1000 |      |     |     |     |     |     |     |     |     |      |

Мой запрос выглядит следующим образом:

SELECT * FROM crosstab(
    $$
    SELECT
      extract(month from created_at) AS themonth,
      extract(day from created_at) AS theday,
      COUNT(*)
    FROM public.users
    WHERE created_at >= Now() - Interval '90 Days' AND created_at < Now() - Interval '1 days'
    GROUP BY created_at
    ORDER BY 1,2
  $$
) AS final_result (
  themonth int,
    theday int
)

Ниже приводится сообщение об ошибке: тип данных rowid не совпадает с типом возвращаемых данных rowid

Я впервые использую кросс-таблицу.

У меня такое ощущение, что это простое исправление, и я был бы признателен за любую помощь.Спасибо!

1 Ответ

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

Есть две проблемы.Объявление строки в final_result должно точно соответствовать кортежам, возвращаемым функцией.Также следует использовать вариант функции с двумя параметрами crosstab(text source_sql, text category_sql).

Пример на 5 дней:

SELECT * FROM crosstab(
    $$
    SELECT
      extract(month from created_at) AS themonth,
      extract(day from created_at) AS theday,
      COUNT(*)
    FROM public.users
    WHERE created_at >= Now() - Interval '90 Days' AND created_at < Now() - Interval '1 days' AND alternate_email not like '%@flyhomes.com%'
    GROUP BY created_at
    ORDER BY 1,2
    $$,
    $$
        SELECT generate_series(1, 5) -- should be (1, 31)
    $$
) AS final_result (
  themonth float, "1" bigint, "2" bigint, "3" bigint, "4" bigint, "5" bigint -- should be up to "31"
)

Рабочий пример в rextester.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...