Как лучше всего использовать таблицы поиска в QlikView?

В QlikView у меня есть таблица Данные и одна таблица базы данных A. Таблицу A следует использовать дважды (A_Left, A_Right). (Таблица A может содержать тысячи записей.)

Мой скрипт загрузки:

A_Left:
Load a_id_left,
     a_name_left
inline [
  a_id_left, a_name_left
  1, 'nwsnd'
  2, 'dcsdcws'
  3, 'fsdf'    ];

A_Rigtht:
Load a_id_right,
     a_name_right
inline  [
  a_id_right, a_name_right
  1, 'nwsnd'
  2, 'dcsdcws'
  3, 'fsdf'    ];

Data:
Load id, 
     a_id_left,
     a_name_left as 'Name_Left',
     a_id_right,
     a_name_right as 'Name_Right',
     data
inline [
  id, a_id_left, a_right_id, data
  1, 1, 2, 37
  1, 1, 3, 18
  1, 2, 3, 62
];

Итак, мой вопрос: как лучше всего использовать таблицы поиска в QlikView? (Должен ли я использовать MAPPING и/или ApplyMap? Почему? Так быстрее?)

Еще одна часть вопроса: поможет ли это изменить структуру данных со звезды на таблицу? (Я знаю, что это потребует больше памяти.) И, кстати: как мне поместить все данные в одну таблицу, чтобы я мог полностью хранить их в одном файле QVD?

Спасибо за помощь идеи.


person smartmeta    schedule 07.10.2013    source источник


Ответы (2)


Для простого поиска, когда вы хотите найти одиночное значение из другого значения, вы можете использовать загрузку MAPPING, а затем использовать функцию ApplyMap(). Например, скажем, у меня есть следующая таблица:

LOAD
   *
INLINE [
   UserID, System
   1, Windows
   2, Linux
   3, Windows
];

У меня есть другая таблица, которая содержит UserID и UserName следующим образом:

LOAD
   *
INLINE [
   UserID, UserName
   1, Alice
   2, Bob
   3, Carol
];

Затем я могу объединить приведенные выше таблицы с ApplyMap следующим образом:

UserNameMap:
MAPPING LOAD
   *
INLINE [
   UserID, UserName
   1, Alice
   2, Bob
   3, Carol
];

SystemData:
LOAD
   UserID,
   ApplyMap('UserNameMap', UserID, 'MISSING') as UserName,
   System
INLINE [
   UserID, System
   1, Windows
   2, Linux
   3, Windows
];

ApplyMap работает очень быстро и не должно значительно замедлять время загрузки (хотя и не так быстро, как прямая загрузка QVD). Однако, как уже упоминалось, ApplyMap можно использовать только в том случае, если вы хотите отобразить одно значение в свою таблицу. Для большего количества полей вам нужно будет использовать join (что похоже на SQL JOIN), если вы хотите объединить свои результаты в одну таблицу.

Если вы не хотите объединять их в одну таблицу (но сохраните ее по схеме «звезда»), просто убедитесь, что имена полей, которые вы хотите связать, совпадают. Например:

A_Left:
Load a_id_left,
     a_name_left as [Name_Left]
inline [
  a_id_left, a_name_left
  1, 'nwsnd'
  2, 'dcsdcws'
  3, 'fsdf'    ];

A_Rigtht:
Load a_id_right,
     a_name_right as [Name_Right]
inline  [
  a_id_right, a_name_right
  1, 'nwsnd'
  2, 'dcsdcws'
  3, 'fsdf'    ];

Data:
Load id, 
     a_id_left,
     a_id_right,
     data
inline [
  id, a_id_left, a_right_id, data
  1, 1, 2, 37
  1, 1, 3, 18
  1, 2, 3, 62
];

(Я удалил ваши поля «имя» из «Данные», так как они не загружались).

Затем это будет работать в вашем документе QlikView благодаря автоматической ассоциативности полей QlikView.

Однако, если вы хотите иметь данные в одной таблице (например, для вывода в QVD), то в вашем случае вам потребуется JOIN две ваши таблицы в Data. Мы можем изменить порядок некоторых таблиц, чтобы немного облегчить себе жизнь. Если мы поместим сначала вашу таблицу Data, мы сможем затем объединить две другие таблицы:

Data:
Load id, 
     a_id_left,
     a_id_right,
     data
inline [
  id, a_id_left, a_id_right, data
  1, 1, 2, 37
  1, 1, 3, 18
  1, 2, 3, 62
];

LEFT JOIN (Data)
Load a_id_left,
     a_name_left as [Name_Left]
inline [
  a_id_left, a_name_left
  1, 'nwsnd'
  2, 'dcsdcws'
  3, 'fsdf'    ];

LEFT JOIN (Data)
Load a_id_right,
     a_name_right as [Name_Right]
inline  [
  a_id_right, a_name_right
  1, 'nwsnd'
  2, 'dcsdcws'
  3, 'fsdf'    ];

Затем это будет использоваться в одной таблице с именем «Данные», которую вы затем можете вывести в QVD и т. Д.

Возможно, вы захотите подумать об оптимизации извлечения «Таблица А», поскольку оно почти загружается дважды, это может занять некоторое время (например, с удаленного сервера и т. д.), поэтому может быть лучше получить ваши данные за один раз, а затем нарезать как только он окажется в памяти (намного быстрее). Быстрый пример может быть таким, как показано ниже:

TableA:
LOAD
     a_id_left,
     a_id_right,
     a_name_left,
     a_name_right
FROM ...;

Data:
Load id, 
     a_id_left,
     a_id_right,
     data
inline [
  id, a_id_left, a_id_right, data
  1, 1, 2, 37
  1, 1, 3, 18
  1, 2, 3, 62
];

LEFT JOIN (Data)
LOAD DISTINCT
     a_id_left,
     a_name_left as [Name_Left]
RESIDENT TableA;

LEFT JOIN (Data)
LOAD DISTINCT
     a_id_right,
     a_name_right as [Name_Right]
RESIDENT TableA;

DROP TABLE TableA;
person i_saw_drones    schedule 06.05.2014

Чтобы ответить на последнюю часть, вы можете использовать функцию СЦЕПИТЬ, чтобы добавить содержимое одной таблицы к другой, т.е.

Final:
Load *
from
   Table1

CONCATENATE

Load *
from
   Table2

даст вам одну таблицу под названием Final с объединенным содержимым Table1 и Table2.

person Skip Intro    schedule 11.10.2013