在QlikView中使用查找表的最佳方法是什么?

时间:2013-10-07 10:44:21

标签: 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文件中?

感谢您提供帮助。

2 个答案:

答案 0 :(得分:1)

对于您希望从另一个值中查找单个值的简单查找,您可以使用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' ]; 表放在第一位,我们就可以加入另外两张表:

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;

然后在一个名为“Data”的表中求助,然后输出到QVD等。

您可能希望考虑优化“表A”提取,因为它几乎被加载两次,这可能需要一些时间(例如来自长途服务器等),因此最好一次性获取数据然后在内存中切片(更快)。一个简单的例子可能如下所示:

{{1}}

答案 1 :(得分:0)

要回答最后一部分,您可以使用CONCATENATE函数将一个表的内容追加到另一个表中,即

Final:
Load *
from
   Table1

CONCATENATE

Load *
from
   Table2

将为您提供一个表,名为Final,其中包含Table1和Table2的合并内容。

相关问题