基于多个驻留表创建新字段
create new field based on multiple resident tables
鉴于多个常驻 tables,我想根据不同 tables 中的字段创建一个新字段。
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
链接的新 table 中,结果是:
id1 val1 newval
a1 car1 car1type1mfr1
a2 car2 car2type2mfr2
努力:
newtable:
load val1 & val2 & val3 as newval;
没有错误,但没有 newtable
或 newval
。
newtable:
left join (table2)
load val1&val2 as newval resident table1;
错误 Field not found - <val2>
。 (显然,我想扩展它以包括 table3
,但如果我不能用 2 table 做到这一点,那么 3 就不起作用。
真实数据包括这个新字段的七个 table(很多外键)。数据从 QVD 加载(数据在多个 QVW 之间共享),非常类似于 SQL 数据库; table 中的 none 是逐行冗余的,因此将 db table 组合成单个 QVD table 可能效率低下。 (再加上一次 table 刷新数据非常容易。)一位同事建议我将每个 QVD 加载到一个巨大的 table 中,但这似乎不对(我也没有成功地链接了几个 tables)。
在 win10-x64 上使用 QV 12.0 桌面在 QVS 上部署。
您的加入方式是错误的,QlikView 只能在加入后处理结果,而不是在处理过程中,因此您将不得不执行另一个驻留加载以将值连接到 Newval 中。 drop table 命令很重要,否则你会得到大量无意的 syn tables
newtable:
left join (table1)
load * resident table2; drop table 2;
Resulttable:
load id1,
val1&val2 as NewVal
resident newtable; drop newtable;
@TheBudac's 是其中的一部分,但它只合并了三个中的两个。大多数问题都源于不正确的 multi-table 连接。我的困惑在于 Qlik 中的 "join" 语法;现在我看到了正在发生的事情,这些文档对我来说很有意义,但最初对我来说并不那么明显。
以下是最终对我最有效的方法:
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;
这产生了这些 table:
这棵树:
快速浏览:
因为我用的是left join
,所以我从最大的table开始;其他连接将规定不同的起始条件要求。在我的例子中,table1
代表最大的,所以我从那个开始:
temptable:
load id1 as id1a, val1 as val1a
resident table1;
每个连接都应该针对我们正在处理的临时 table。重命名变量很重要,这样 Qlik 就不会创建不必要的合成键。
left join (temptable)
load id2 as id2a, id1 as id1a, val2 as val2a
resident table2;
resident
的使用很重要,因为它不会重新查询(SQL)或重新加载(QVD或其他文件)。
用第三个和更多 table 重复,始终加入 against temptable
与新的 table.
现在我们使用那个临时 table 来创建我们新的 table。您可以选择使用此数据来扩充 table1
(当然可行),但对我来说,因为我正在生成几个新的计算字段(此处未显示),所以将它们在逻辑上分开是有意义的。
newtable:
load id1a as id1,
val1a & val2a & val3a as newval
resident temptable;
drop table temptable;
请注意,我将相关键重命名回其原始值,以便此 table 正确链接到 table
。删除临时 table 有助于清理,但保留它无害(这样做有助于 debugging/learning)。
鉴于多个常驻 tables,我想根据不同 tables 中的字段创建一个新字段。
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
链接的新 table 中,结果是:
id1 val1 newval
a1 car1 car1type1mfr1
a2 car2 car2type2mfr2
努力:
newtable:
load val1 & val2 & val3 as newval;
没有错误,但没有 newtable
或 newval
。
newtable:
left join (table2)
load val1&val2 as newval resident table1;
错误 Field not found - <val2>
。 (显然,我想扩展它以包括 table3
,但如果我不能用 2 table 做到这一点,那么 3 就不起作用。
真实数据包括这个新字段的七个 table(很多外键)。数据从 QVD 加载(数据在多个 QVW 之间共享),非常类似于 SQL 数据库; table 中的 none 是逐行冗余的,因此将 db table 组合成单个 QVD table 可能效率低下。 (再加上一次 table 刷新数据非常容易。)一位同事建议我将每个 QVD 加载到一个巨大的 table 中,但这似乎不对(我也没有成功地链接了几个 tables)。
在 win10-x64 上使用 QV 12.0 桌面在 QVS 上部署。
您的加入方式是错误的,QlikView 只能在加入后处理结果,而不是在处理过程中,因此您将不得不执行另一个驻留加载以将值连接到 Newval 中。 drop table 命令很重要,否则你会得到大量无意的 syn tables
newtable:
left join (table1)
load * resident table2; drop table 2;
Resulttable:
load id1,
val1&val2 as NewVal
resident newtable; drop newtable;
@TheBudac's 是其中的一部分,但它只合并了三个中的两个。大多数问题都源于不正确的 multi-table 连接。我的困惑在于 Qlik 中的 "join" 语法;现在我看到了正在发生的事情,这些文档对我来说很有意义,但最初对我来说并不那么明显。
以下是最终对我最有效的方法:
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;
这产生了这些 table:
这棵树:
快速浏览:
因为我用的是
left join
,所以我从最大的table开始;其他连接将规定不同的起始条件要求。在我的例子中,table1
代表最大的,所以我从那个开始:temptable: load id1 as id1a, val1 as val1a resident table1;
每个连接都应该针对我们正在处理的临时 table。重命名变量很重要,这样 Qlik 就不会创建不必要的合成键。
left join (temptable) load id2 as id2a, id1 as id1a, val2 as val2a resident table2;
resident
的使用很重要,因为它不会重新查询(SQL)或重新加载(QVD或其他文件)。用第三个和更多 table 重复,始终加入 against
temptable
与新的 table.现在我们使用那个临时 table 来创建我们新的 table。您可以选择使用此数据来扩充
table1
(当然可行),但对我来说,因为我正在生成几个新的计算字段(此处未显示),所以将它们在逻辑上分开是有意义的。newtable: load id1a as id1, val1a & val2a & val3a as newval resident temptable; drop table temptable;
请注意,我将相关键重命名回其原始值,以便此 table 正确链接到
table
。删除临时 table 有助于清理,但保留它无害(这样做有助于 debugging/learning)。