powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Транспонировать несколько статусов
10 сообщений из 10, страница 1 из 1
Транспонировать несколько статусов
    #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
Транспонировать несколько статусов
    #39881467
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использовать функцию CROSSTAB(). Для этого её надо сначала установить в базу командой

CREATE EXTENSION IF NOT EXISTS tablefunc;

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

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

Пример был по адресу
...
Рейтинг: 0 / 0
Транспонировать несколько статусов
    #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
Транспонировать несколько статусов
    #39883073
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне казалось, что я ответил. На основе примеров это легко сделать
(если под транспонированием понималось превращение строк в столбцы).
В MySQL (и в Oracle) для поворачивания таблицы вместо функции CROSSTAB
используется выражение PIVOT в операторе SELECT.
CROSSTAB или PIVOT можно заменить на несколько UNION, но эта запись менее компактная и наглядная.
В вашем примере на MySQL мне разбираться не захотелось.
...
Рейтинг: 0 / 0
Транспонировать несколько статусов
    #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
Транспонировать несколько статусов
    #39883563
xwootx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Видимо, я все же был не прав, описываю задачу.
Скорее мне нужно разбить пул дат из поля created_at в зависимости от того или иного статуса из поля to_status , создав столбцы с датами, обозвав их именем статуса...
...
Рейтинг: 0 / 0
Транспонировать несколько статусов
    #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
Транспонировать несколько статусов
    #39884668
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xwootx,
Вариант
Но мне кажется проще изменить постановку задачи.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Транспонировать несколько статусов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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