Redshift - много столбцов в ряды (Unpivot) - PullRequest
0 голосов
/ 12 октября 2018

В Redshift:

У меня есть таблица с 30 полями измерений и более 150 полями мер.
Чтобы эффективно использовать эти данныев инструменте визуализации (таблица) мне нужно отключить столбцы мер только для одной меры и одного измерения, чтобы классифицировать их.

Краткий пример:

   Date         Country    Order     Banana  Apple  Orange  Kiwi Lemon

    1-10-2018    Belgium    XYZ789    14       0     10      16    7
    1-10-2018    Germany    ABC123    10      15      3      15    3
    2-10-2018    Belgium    KLM456     9       9      7       1    7

Результат:

   Date         Country    Order     Measure_Name   Measure_Value
    1-10-2018    Belgium    XYZ789    Banana         14
    1-10-2018    Belgium    XYZ789    Apple           0
    1-10-2018    Belgium    XYZ789    Orange         10
    1-10-2018    Belgium    XYZ789    Kiwi           16
    1-10-2018    Belgium    XYZ789    Lemon           7
    1-10-2018    Germany    ABC123    Banana         10
    1-10-2018    Germany    ABC123    Apple          15
    1-10-2018    Germany    ABC123    Orange          3
    1-10-2018    Germany    ABC123    Kiwi           15
    1-10-2018    Germany    ABC123    Lemon           3
    2-10-2018    Belgium    KLM456    Banana          9
    2-10-2018    Belgium    KLM456    Apple           9
    2-10-2018    Belgium    KLM456    Orange          7
    2-10-2018    Belgium    KLM456    Kiwi            1
    2-10-2018    Belgium    KLM456    Lemon           7

Я знаю и попробовал решение «UNION ALL», но моя таблица насчитывает миллионы строк, и более 150 столбцов, которые нужно отключить, действительно слишком велики дляэто решение.(Даже SQL имеет длину более 8 тыс. Строк)

У вас есть идея, чтобы помочь мне?

Большое спасибо,

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

При написании этого кода «императивно», вы бы хотели генерировать больше строк из одной, возможно, используя что-то вроде flatMap (или эквивалент в вашем языке программирования).Для генерации строк в SQL вы должны использовать JOIN.

Эта проблема может быть решена путем (CROSS) JOIN объединения вашей таблицы с другой, имеющей столько строк, сколько столбцов для unpivot .Вам нужно добавить условную магию и Вуаля! .

CREATE TABLE t (
  "Date" date, 
  "Country" varchar, 
  "Order" varchar, 
  "Banana" varchar, 
  "Apple" varchar, 
  "Orange" varchar, 
  "Kiwi" varchar, 
  "Lemon" varchar
);

INSERT INTO t VALUES ('1-10-2018', 'Belgium', 'XYZ789', '14', '0', '10', '16', '7');
INSERT INTO t VALUES ('1-10-2018', 'Germany', 'ABC123', '10', '15', '3', '15', '3');
INSERT INTO t VALUES ('2-10-2018', 'Belgium', 'KLM456', '9', '9', '7', '1', '7');

WITH 
    cols as (
      select 'Banana' as c
      union all 
      select 'Apple' as c
      union all 
      select 'Orange' as c
      union all 
      select 'Kiwi' as c
      union all 
      select 'Lemon' as c
      )
select 
    "Date", 
    "Country", 
    "Order",
    CASE c 
        WHEN 'Banana' THEN "Banana" 
        WHEN 'Apple' THEN "Apple"
        WHEN 'Orange' THEN "Orange"
        WHEN 'Kiwi' THEN "Kiwi"
        WHEN 'Lemon' THEN "Lemon"
        ELSE NULL
    END as v

from t cross join cols;

https://www.db -fiddle.com / f / kojuPAjpS5twCKXSPVqYyP / 2

0 голосов
/ 12 октября 2018

Учитывая, что у вас есть 150 столбцов для транспонирования, я не думаю, что это возможно сделать с SQL.У меня был почти такой же точный сценарий, и я использовал python для его решения.Псевдокод и пояснение к этому вопросу

Redshift.Как мы можем транспонировать (динамически) таблицу из столбцов в строки?

...