Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Транспонировать несколько статусов / 10 сообщений из 10, страница 1 из 1
25.10.2019, 11:51
    #39881442
xwootx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транспонировать несколько статусов
Всем привет! Очень нужен запрос, который будет формировать в существующую таблицу новвые столбцы, на основе нескольких "статусов" из рядов и добавлять к ним дату того или иного статуса. Пример.


id Дата обновления В статус
12 09.08.2017 in_progress
12 09.08.2017 approved
100 09.08.2017 in_progress
100 10.08.2017 correction
100 11.08.2017 approved


необходимо вынести статусы из "В статус" в столбцы, и уже к каждому столбцу статуса подцепить дату обновления (по сути, перехода в данный статус)
...
Рейтинг: 0 / 0
25.10.2019, 12:10
    #39881467
Partisan M
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транспонировать несколько статусов
Использовать функцию CROSSTAB(). Для этого её надо сначала установить в базу командой

CREATE EXTENSION IF NOT EXISTS tablefunc;

Описание CROSSTAB и примеры найдёте в google.
...
Рейтинг: 0 / 0
25.10.2019, 12:26
    #39881494
xwootx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транспонировать несколько статусов
Partisan M,

А можно с примером запроса? Заранее большое спасибо!
...
Рейтинг: 0 / 0
25.10.2019, 12:33
    #39881498
Partisan M
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транспонировать несколько статусов
у меня записан один пример запроса. Вообще-то их легко найти в google по словам postgresql crosstab, а также надо посмотреть описание crosstab в документации.

Пример был по адресу
...
Рейтинг: 0 / 0
30.10.2019, 12:42
    #39883058
xwootx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транспонировать несколько статусов
В итоге, нашелся старый MySQL запрос. Но к сожалению, переделать его в Postgres не вышло.

Суть: создаю столбцы в таблице с наименованиями статусов:
alter table expertise_subject_surveys add column mks_approval timestamp DEFAULT NULL;

Далее старый mysql-запрос:

update expertise_subject_surveys es2
inner join(
select es.id id, max(st.created_at) approval_last from expertise_subject_surveys es
inner join state_transitions st ON st.statable_id = es.id AND st.statable_type = 'Expertise::SubjectSurvey' and st.to_status = 'on_mks_approval'
group by es.id) aa
on aa.id = es2.id
set es2.mks_approval = aa.approval_last;

По сути - должен заполнять столбец mks_approval датами из статуса "on_mks_approval", благодаря столбцу дат из st.created_at
...
Рейтинг: 0 / 0
30.10.2019, 13:23
    #39883073
Partisan M
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транспонировать несколько статусов
Мне казалось, что я ответил. На основе примеров это легко сделать
(если под транспонированием понималось превращение строк в столбцы).
В MySQL (и в Oracle) для поворачивания таблицы вместо функции CROSSTAB
используется выражение PIVOT в операторе SELECT.
CROSSTAB или PIVOT можно заменить на несколько UNION, но эта запись менее компактная и наглядная.
В вашем примере на MySQL мне разбираться не захотелось.
...
Рейтинг: 0 / 0
30.10.2019, 14:19
    #39883106
xwootx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транспонировать несколько статусов
Спасибо за ответ. Но это не совсем так.

В моей задаче необходимо не только в ручную создать столбцы с несколькими вариантами статусов, но и автоматически подтянуть дату из st.created_at к тому или иному статусу. По логике Вашего запроса, я должен в ручную внести все даты к статусу (а их несколько тысяч). В рамках одного ID (es2.id) может быть несколько итераций одного статуса. Вот эту уникальную дату я и хочу засунуть к конкретному статусу, в столбец. Как я и привел в первом примере, есть сейчас :

id Дата обновления В статус
12 09.08.2017 in_progress
12 09.08.2017 approved
100 09.08.2017 in_progress
100 10.08.2017 correction
100 11.08.2017 approved

А нужно:
id in_progress approved correction
12 09.08.2017 09.08.2017 15.08.2017
12 15.08.2017 16.08.2017 15.08.2017
100 11.01.2017 12.08.2017 null
100 17.05.2017 19.05.2017 18.05.2017
100 25.07.2017 30.07.2017 null
...
Рейтинг: 0 / 0
31.10.2019, 13:05
    #39883563
xwootx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транспонировать несколько статусов
Видимо, я все же был не прав, описываю задачу.
Скорее мне нужно разбить пул дат из поля created_at в зависимости от того или иного статуса из поля to_status , создав столбцы с датами, обозвав их именем статуса...
...
Рейтинг: 0 / 0
02.11.2019, 01:11
    #39884548
Sergei.Agalakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транспонировать несколько статусов
Это надо?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
with t1 as
(
select 12 as id,  to_timestamp('09.08.2017','DD-MM-YYYY') as status_ts, 'in_progress' as status
union all
select 12 as id,  to_timestamp('09.08.2017','DD-MM-YYYY') as status_ts, 'approved' as status
union all
select 100 as id,  to_timestamp('09.08.2017','DD-MM-YYYY') as status_ts, 'in_progress' as status
union all
select 100 as id,  to_timestamp('10.08.2017','DD-MM-YYYY') as status_ts, 'correction' as status
union all
select 100 as id,  to_timestamp('11.08.2017','DD-MM-YYYY') as status_ts, 'approved' as status
)
select id, 
       max(
       case 
       when t1.status = 'in_progress'
       then t1.status_ts
       end
       ) as "in_progress",
       max(
       case 
       when t1.status = 'approved'
       then t1.status_ts
       end
       ) as "approved",
       max(
       case 
       when t1.status = 'correction'
       then t1.status_ts
       end
       ) as "correction"
  from t1
group by id 



Код: plaintext
1.
2.
3.
id	in_progress             approved                correction
12	2017-08-09 00:00:00	2017-08-09 00:00:00	
100	2017-08-09 00:00:00	2017-08-11 00:00:00	2017-08-10 00:00:00
...
Рейтинг: 0 / 0
02.11.2019, 22:15
    #39884668
Troglodit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транспонировать несколько статусов
xwootx,
Вариант
Но мне кажется проще изменить постановку задачи.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Транспонировать несколько статусов / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]