【问题标题】:create new field based on multiple resident tables基于多个常驻表创建新字段
【发布时间】:2017-08-25 01:38:28
【问题描述】:

鉴于多个驻留表,我想根据不同表中的字段创建一个新字段。

table1:
LOAD * INLINE [
id1,val1
a1,car1
a2,car1
];

table2:
LOAD * INLINE [
id2,id1,val2
b1,a1,type1
b2,a2,type2
];

table3:
LOAD * INLINE [
id3,id2,val3
c1,b1,mfr1
c2,b2,mfr2
];

为了论证,假设 table1 有 ~1M 行,table2 ~1K 行,table3 ~10 行。我想创建一个新字段,添加到table1 或者可能在id1 链接的新表中,结果是:

id1  val1  newval
a1   car1  car1type1mfr1
a2   car2  car2type2mfr2

努力:

newtable:
load val1 & val2 & val3 as newval;

没有错误但没有newtablenewval

newtable:
left join (table2)
load val1&val2 as newval resident table1;

Field not found - <val2> 出错。 (显然我想扩展它以包括table3,但如果我不能用 2 个表来做,那么 3 个就行不通了。

真实数据包括这个新字段的七个表(大量外键)。数据从 QVD 加载(数据在多个 QVW 之间共享),非常类似于 SQL 数据库;这些表都不是逐行冗余的,因此将 db 表组合成一个 QVD 表可能效率低下。 (再加上一次刷新一个表非常容易。)一位同事建议我将每个 QVD 加载到一个巨大的表中,但这似乎不对(我也没有成功地链连接几个表)。

在 win10-x64 上使用 QV 12.0 桌面在 QVS 上进行部署。

【问题讨论】:

    标签: join qlikview


    【解决方案1】:

    @TheBudac's 是其中的一部分,但它只合并了三个中的两个。大多数问题源于不正确的多表连接。我的困惑在于 Qlik 中的“加入”语法。既然我看到了正在发生的事情,这些文档对我来说很有意义,但最初对我来说并不那么明显。

    以下是最终对我最有效的方法:

    temptable:
    load id1 as id1a, val1 as val1a
    resident table1;
    left join (temptable)
    load id2 as id2a, id1 as id1a, val2 as val2a
    resident table2;
    left join (temptable)
    load id2 as id2a, val3 as val3a
    resident table3;
    
    newtable:
    load id1a as id1,
      val1a & val2a & val3a as newval
    resident temptable;
    
    drop table temptable;
    

    这产生了这些表格:

    还有这棵树:

    快速演练:

    1. 因为我用的是left join,所以我从最大的表开始;其他联接将规定不同的起始条件要求。在我的例子中,table1 代表最大,所以我从这个开始:

      temptable:
      load id1 as id1a, val1 as val1a
      resident table1;
      
    2. 每个连接都应该针对我们正在处理的临时表。重命名变量很重要,这样 Qlik 就不会创建不必要的合成键。

      left join (temptable)
      load id2 as id2a, id1 as id1a, val2 as val2a
      resident table2;
      

      resident 的使用很重要,因为它不会重新查询 (SQL) 或重新加载(QVD 或其他文件)。

      重复第三个和更多的表,总是加入 反对 temptable 的新表。

    3. 现在我们使用该临时表来创建我们的新表。您可以选择用这些数据来扩充table1(当然可行),但对我来说,因为我正在生成几个新的计算字段(此处未显示),所以将它们在逻辑上分开是有意义的。

      newtable:
      load id1a as id1,
        val1a & val2a & val3a as newval
      resident temptable;
      
      drop table temptable;
      

      请注意,我将相关键重命名为其原始值,以便此表正确链接到 table。删除临时表有助于清理工作,但保留它并没有什么坏处(这样做有助于调试/学习)。

    【讨论】:

      【解决方案2】:

      您的加入方式错误,QlikView 只能在加入后处理结果,而不是在处理中,因此您必须进行另一个常驻加载才能将值连接到 Newval。删除表命令很重要,否则您最终会得到大量无意的同步表

      newtable:
      left join (table1)
      load * resident table2; drop table 2;
      
      Resulttable:
      load id1,
      val1&val2 as NewVal
      resident newtable; drop newtable;
      

      【讨论】:

      • 感谢@TheBudac 的回答!这是多表连接问题的良好开端。我认为您的回答中缺少的部分是嵌套或链接是如何发生在原始表中的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-16
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多