Vertica: как вы можете объединить значения по какому-либо порядку? - PullRequest
0 голосов
/ 26 апреля 2019

Предположим, у вас есть столбцы

ID | A | B | C
1  | 3 | 1 | 2
2  | 5 | 9 | 1
3  | 1 | 2 | 3 

и вы хотите, чтобы столбцы были объединены так, чтобы конечный результат выглядел как

ID | ABC_value_DESC | ABC_value_DESC_colnames
1  | 3,2,1          | A,C,B
2  | 9,5,1          | B,A,C
3  | 3,2,1          | C,B,A 

где вы хотите получить значения col в порядке убывания в новом столбце ABC_value_DESC и затем вернуть соответствующее имя столбца в новом столбце ABC_value_DESC_colnames.

Как можно объединить значения нескольких столбцов в новый столбец в порядке убывания и вернуть имена столбцов по порядку значений (не в порядке имен) в Vertica 9?


Ps. Я пробовал Listagg -функцию, но ошибки такие, что упорядочение не реализовано, и когда попробовал предложение Vertica здесь , дающее ложный результат, и даже ошибки с альтернативным здесь .

1 Ответ

1 голос
/ 26 апреля 2019

Вы можете сделать это с неприятным выражением case. Для трех столбцов это не так уж и плохо:

select t.*,
       (gr || ',' ||
        (case when a not in (le, gr) then a
              when b not in (le, br) then b
              else c
         end) || ',' ||
        le
       ),
       ((case gr when a then 'a' when b then 'b' else 'c' end) || ',' ||
        (case when a not in (gr, le) then 'a'
              when b not in (gr, le) then 'b'
              else 'c'
         end) || ',' ||
        (case le when a then 'a' when b then 'b' else 'c' end)
       )          
from (select t.*, greatest(a, b, c) as gr, least(a, b, c) as le
      from t
     ) t;

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

...