Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как получить сводную таблицу значений? / 3 сообщений из 3, страница 1 из 1
13.05.2020, 12:38
    #39956761
java-newbie
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить сводную таблицу значений?
Доброе время суток.

Есть приборы:
Код: plaintext
1.
2.
3.
4.
id | title 
---|------
1  | dev1
2  | dev2

У которых есть параметры:
Код: plaintext
1.
2.
3.
4.
5.
id | device_id | title 
---|-----------|------
1  | 1         | par1
2  | 1         | par2
3  | 2         | par3

Есть значения этих параметров по времени:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
id | param_id | value | date
---|----------|-------|-----
1  | 1        | 1     | 2020-01-01 00:00:00
2  | 1        | 2     | 2020-01-01 01:00:00
3  | 1        | 3     | 2020-01-01 02:00:00
4  | 2        | 4     | 2020-01-01 00:00:00
5  | 3        | 5     | 2020-01-01 00:00:00
6  | 3        | 6     | 2020-01-01 01:00:00

Как получить свобдную таблицу по приборам и по времени? Вот такую:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
date                | device_id | par1 | par2 | par3
--------------------|-----------|------|------|-----
2020-01-01 00:00:00 | 1         | 1    | 4    | null
2020-01-01 01:00:00 | 1         | 2    | null | null
2020-01-01 02:00:00 | 1         | 3    | null | null
2020-01-01 00:00:00 | 2         | null | null | 5
2020-01-01 01:00:00 | 1         | null | null | 6
...
Рейтинг: 0 / 0
14.05.2020, 07:56
    #39957225
Swa111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить сводную таблицу значений?
java-newbie,

Если список категорий известен, то все сводится к такому запросу

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select 
  date,
  device_id,
  max(case when param_id = 1 then value end) par1,
  max(case when param_id = 1 then value end) par2,
  max(case when param_id = 1 then value end) par3
from
  t
group by 
  date,
  device_id



Если не известно какие категории есть, то используем динамическую сборку запроса в два этапа, сначала находим все возможные варианты param_id, потом для каждого добавляем в запрос строку
max(case when param_id = <Param_Value> then value end) par<Param_Value>.

Еще советую ознакомится с расширением crosstab
...
Рейтинг: 0 / 0
14.05.2020, 09:15
    #39957250
java-newbie
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить сводную таблицу значений?
Swa111,

через crosstab и пробовал сразу. по прибору или по времени не было вопросов получить, а вот по обоим были затруднения.

получилось так:
Код: 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.
SELECT *
FROM crosstab(
    'SELECT
        CONCAT(v.date, $$-$$, p.device_id) AS device,
        v.date,
        p.device_id,
        v.param_id,
        v.value
    FROM
        values AS v
        JOIN params AS p ON p.id = v.param_id
    ORDER BY
        device',
    'SELECT
        id
    FROM
        params
    ORDER BY
        id') AS (
        device VARCHAR,
        date TIMESTAMP,
        device_id INT,
        par1 DOUBLE PRECISION,
        par2 DOUBLE PRECISION,
        par3 DOUBLE PRECISION
    )
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как получить сводную таблицу значений? / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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