SQL: агрегат и конденсат - PullRequest
       23

SQL: агрегат и конденсат

0 голосов
/ 16 января 2020

Я мог бы сделать что-то, что я не могу понять, как это сделать. У меня есть простой запрос, который мне нужно объединить и сжать. Вот базовый скрипт:

select t.serial, t.make, t.model, t.upgrade_date, t.software_version             
FROM table t
Order by t.serial

Это электрические устройства, которые были обновлены программно (до 3 раз). Приведенный выше скрипт, конечно, предоставит несколько строк для одного устройства, но с различными версиями программного обеспечения, в то время как марка и модель остаются неизменными. Я понимаю, как объединить это в одну строку, используя max, например, чтобы показать последнюю версию программного обеспечения. Тем не менее, мне нужно агрегировать и иметь сжатый столбец, показывающий КАЖДЫЙ софт_версии (по порядку), на котором было устройство.

Это может выглядеть так:

+------------------------------------------+ 
| Serial | Make | Model | Version_history  |
+------------------------------------------+
| A        Terra  1       1.1, 1.9, 2.1    |
+------------------------------------------+

В качестве альтернативы и возможно, было бы лучше, если бы в каждой версии устройства была указана каждая версия software_version в виде заголовка столбца с параметром upgrade_date. На самом деле, было бы полезно знать оба метода.

Это могло бы выглядеть так:

+------------------------------------------------------------------------+
| Serial   Make   Model   1.1           1.9           2.1            2.3 |
+------------------------------------------------------------------------+
| A        Terra  1       01-Jan-2019   17-Jun-2019   31-Dec-2019        |
+------------------------------------------------------------------------+

Без сомнения, это действительно просто, но я не могу понять, как я это понимаю. вне.

1 Ответ

2 голосов
/ 16 января 2020

Использовать LISTAGG:

select serial,
       make,
       model,
       LISTAGG( software_version, ',' ) WITHIN GROUP ( ORDER BY upgrade_date )
         AS Version_history,
       LISTAGG( upgrade_date, ',' ) WITHIN GROUP ( ORDER BY upgrade_date )
         AS Version_dates
FROM   table
GROUP BY serial, make, model
Order by serial

В качестве альтернативы и, возможно, лучше, было бы неплохо показать каждую версию_программы в качестве заголовка столбца с параметром «upgrade_date», если устройство было в этой версии.

Если вам известны версии, вы можете сделать это с помощью PIVOT:

SELECT serial,
       make,
       model,
       "1.1",
       "1.9",
       "2.1",
       "2.3"
FROM   table
PIVOT ( MAX( upgrade_date ) FOR software_version IN (
  '1.1' AS "1.1",
  '1.9' AS "1.9",
  '2.1' AS "2.1",
  '2.3' AS "2.3"
) )

db <> fiddle

Если вы не знаете версии, тогда это будет dynamici c pivot и это не простой запрос SQL. Вам нужно будет использовать двухэтапный процесс, чтобы сначала сгенерировать динамический запрос c SQL, а затем второй использовать EXECUTE IMMEDIATE для выполнения запроса. В общем, вы не должны использовать динамические c pivots и вместо этого транспонировать строки в столбцы в любом интерфейсе программирования, который вы используете для доступа к базе данных (Java, Python, C#, et c .).

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