如何将循环插入到 JSL 脚本中使用的 SQL 中?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />你好,
我需要从许多生产晶圆的最终测试仪中收集芯片级参数测试数据。
每个晶圆有大约 3000 个芯片和 10 多个参数。
为了请求帮助,我创建了一个虚拟 SQL:
选择
I.PRODUCTNR,
T.TESTUNITNR,
T.MEASUREMENTPOINTNR,
T.创作时间,
T.RESULT_PARAM1,
T.RESULT_PARAM2。
.
.
.
从
“项目”D,
“测试结果”T,
“测试结果”TRR,
“测试”TR,
.
.
其中 I.IDNR = T.IDNR
AND T.TESTRESULTNR = TRR.TESTRESULTNR
AND TRR.TESTROWIDNR = TR.TESTROWIDNR
AND I.LOTIDNR = L.LOTIDNR
AND T.VALIDITY = '1'
和 D.WAFERNR 在
(
'WAF43K309A',
'WAF43K310A',
'WAF43K311A',
'WAF43K312A',
'WAF43K313A',
'WAF43K314A',
., ., ., ., .,
'WAF43K315A',
'WAF43K316A',
'WAF43K317A',
'WAF43K319A',
'WAF43K320A',
'WAF43K321A'
)
AND (T.TESTUNITNR LIKE ('HENE%')
和 TR.VARIABLENAME 在
( '阿塞纳姆',
'OFFSET_X_DIFF',
'OFFSET_Y_DIFF',
……)
通过...分组 ...
如果我收集列出的第一个晶圆 (WAF43K309A) 的所有数据,收集/获取时间约为 90 秒。
如果我收集列出的前 2 个晶圆(WAF43K309A、WAF43K310A)的所有数据,收集/获取时间约为 4 分钟
如果我收集列出的前 3 个晶圆(WAF43K309A、WAF43K310A、WAF43K311A)的所有数据,收集/获取时间约为 7 分钟
我相信你看到了问题,收集/获取时间随着晶圆数量呈指数增长。
有时我必须在周末做这个!!
使用 SQL“Union All”运算符并一次收集一个晶圆的数据,我可以使用大致相同的时间为每个晶圆检索数据。
如果我的列表中只有几个晶圆,这没关系。不幸的是,我经常需要从几十个晶圆,甚至数百个晶圆中收集数据。
使用内部选择,我可以列出晶圆:
例如
.....
和 D.WAFERNR 在 (
从 ITEM 中选择 WAFERNR
测试日期 > SYSDATE-5)
由此产生的晶圆清单将是:
WAF43K309A
WAF43K310A
WAF43K311A
WAF43K312A
WAF43K313A
WAF43K314A
WAF43K315A
WAF43K316A
WAF43K317A
WAF43K319A
WAF43K320A
WAF43K321A
是否可以使用 JSL,通过遍历列表并一次收集一个晶圆的数据来使用此列表?
期待看到社区可能提供的创造性解决方案
一个解决方案将是一份很棒的圣诞礼物
此致,
菲利普
回复:如何在 JSL 脚本中使用的 SQL 中插入循环?嗨约瑟夫,
谢谢您的意见。
我喜欢您构建用于 SQL 脚本的列表的方式,并且确信我可以在需要时使用它。
在这种特殊情况下,我们的想法是避免在 SQL 中使用晶圆列表,因为与一次一个晶圆的方法相比,它会减慢数据采集速度。
此致,
菲利普
回复:如何在 JSL 脚本中使用的 SQL 中插入循环?你好
我使用以下脚本创建包含很多列表的行
批次清单=柱子( 1个) <<获取值;
in_list = “('” ||拼接项目( 批次列表, "','" ) || "')" ;
sql_string = “在哪里!很多!” 在 ” || in_list ;
// /如果你想看到字符串/ / /
节目( sql_string ) ;
*如果批号在某个地方有空格并且您需要搜索“like”'%lot number'...它在 SQL 中不起作用。您将需要创建不同的脚本
回复:如何在 JSL 脚本中使用的 SQL 中插入循环?嗨姆夏普,
非常感谢您的投入。
我现在已经将脚本部分的这个“垂直连接”部分合并到主脚本中,它很有用
数据提取所需的时间已减少到以前的一小部分,并且可以编写脚本并自动执行整个过程,这使我可以在服务器负载较轻的夜间进行此操作。
此致,
菲利普
回复:如何在 JSL 脚本中使用的 SQL 中插入循环?有很多方法可以解决最后一个问题。最直接和最简单的解决方案可能不是很直观。您要做的是创建一个表列表,然后将每个数据表推送到列表中。 然后您可以立即将列表连接在一起。这是大纲:
我的表格= {} ;
为了(一世= 1...
dt =执行sql ( ... ) ;
插入(我的表格, dt ) ;
) ;
全部=新表( “所有数据” ) ;
全部<<串联(
评估(我的表格) ,
输出表( “所有数据” )
) ;
回复:如何在 JSL 脚本中使用的 SQL 中插入循环?嗨,PMroz,
非常感谢您的支持和耐心等待。
根据您的输入以及埃里克希尔,罗恩霍恩和锐化我现在能够像我希望的那样设置嵌套 SQL 查询。
这种方法可以直接移植到本文开头提到的更高级的数据采集任务中,它将节省许多等待服务器返回数据的时间。
我在这次练习中学到了很多东西,感谢您的所有努力。
最后一个问题....
现在我已经将所有数据收集到单独的数据表中(这样做是为了加快数据采集速度)有没有一种方法,无需保存所有数据表,对所有打开的表执行串联,以便我可以更轻松地执行数据分析?
我已经可以通过保存所有数据表并在重新打开时使用 JSL 连接它们来做到这一点,但必须这样做似乎很愚蠢。
祝大家圣诞快乐,
菲利普
回复:如何在 JSL 脚本中使用的 SQL 中插入循环?我认为这可以解决问题:
// 示例表 - 如果表已经存在,则不必执行此步骤。 但你应该创造
// 指向它的变量。
wafer_dt =新表( “晶圆号” ,
添加行( 9 ) ,
新建专栏( “晶圆号” ,
特点,
标称,
设置值(
{ “XC6A49L410.1” , “XC6A49L411.1” , “XC6A49L412.1” , “XC6A49L413.1” ,
“XC6A49L414.1” , “XC6A49L415.1” , “XC6A49L416.1” , “XC6A49L417.1” ,
“XC6A49L418.1” }
)
)
) ;
// 例如,如果您的表名为 Wafer Numbers,则此语句将为该表分配一个变量
// wafer_dt = data table("Wafer Numbers");
// 将晶片编号存储在列表中
晶圆清单=柱子( wafer_dt , “晶圆号” ) <<获取值;
dsn_string = "DSN=MEASdata;UID=USER;PWD=PASSWORD;DBQ=MDMANU.WORLD;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T ;RST=T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=O;MLD =0;ODA=F;TSZ=8192;" ;
// 创建一个 SQL 语句,其中晶片编号是要在循环期间替换的变量
sql语句=评估插入(
"\[ 选择 WaferNR,WIPSTATUS
来自“光盘”
WHERE WaferNR = '^one_wafer^']\" ) ;
// 创建到数据库的连接
数据库=创建数据库连接( dsn_string ) ;
为了(一世= 1个,一世<=物品(晶圆清单) ,一世++,
one_wafer =晶圆清单[一世] ;
// 将表命名为与晶圆相同的名称。更改以满足您的需求
表名= one_wafer ;
// 检索一个晶圆的数据
dt =执行sql (数据库, sql语句,表名) ;
) ;
// 现在我们已经完成了将所有晶圆检索到单独的表中的工作
// 关闭与数据库的连接
关闭数据库连接(数据库) ;
回复:如何在 JSL 脚本中使用的 SQL 中插入循环?您显然错过了我所说的信息和意图。
无论如何,这个论坛帖子没有理由比 Ron Horne 的帖子长,因为他链接到一个我已经逐步解决了这个问题的论坛。
回复:如何在 JSL 脚本中使用的 SQL 中插入循环?如果我直接请求帮助以某种方式冒犯了您,我向 MSHARP 道歉。
正如我自己已经说过的,不幸的是我不是 JSL 方面的专家,但我已经根据这个社区提供的内容设法做了很多事情。
事实上,我确实参加了为期 2 天的 JMP JSL 课程,但不幸的是,由于它是由欧洲当地办事处为一位美国教师组织的,课程非常国际化,因此在这 2 天里出现了很多技术故障,浪费了很多时间,留下了大量的材料和练习没有被涵盖。
到目前为止,我已经从这个社区的其他成员那里得到了很好的反馈,事实上,我正在与 JMP 合作,根据我拥有更多知识和经验的领域编写即将发布的教程。
我从来没有声称其他成员提供的任何帮助是我自己的工作。 我一直在公开说明援助的来源以及属于这样一个支持团体的感觉有多棒,在这个团体中可以比其他社区更快更远地攀登学习曲线。
我只能希望其他人分享我的感受,并继续支持和教导能力较差的人。
真挚地,
菲利普
回复:如何在 JSL 脚本中使用的 SQL 中插入循环?你明白了,去做吧。
我认为你的方法有误。 如果您需要 jmp 社区为您提供简单案例的代码,您将无法为复杂案例实施它。 看起来你已经开始了一个项目。在这种情况下,我建议您阅读脚本指南或参加课程。
确实,要从社区中获得最大收益,您应该首先自己开发代码;然后当在调试或优化过程中卡住时,社区可以更好地帮助您重构它。像这样直接索取代码无异于剽窃。
回复:如何在 JSL 脚本中使用的 SQL 中插入循环?嗨,埃里克、罗恩和 PMroz,
谢谢大家的意见。
不幸的是,我的 JSL 能力还没有达到我可以接受所有输入并构建工作脚本的水平。
我无法从您的 3 个输入中确定逻辑和顺序。 我仍然感到困惑,但在更高层次上
我的努力只是返回我的“wafers.jmp”列表中最后一个晶圆的数据。
我举一个更简单的例子怎么样,至少我不会感到困惑。
我在名为“wafers.jmp”的文件中有一个晶圆列表:
XC6A49L410.1
XC6A49L411.1
XC6A49L412.1
XC6A49L413.1
XC6A49L414.1
XC6A49L415.1
XC6A49L416.1
XC6A49L417.1
XC6A49L418.1
我需要使用适当的 SQL 收集所列晶圆的 WIPSTATUS:
选择 WaferNR,WIPSTATUS
来自“光盘”
WHERE WaferNR =(上面列表中的所有晶圆)
为此,我需要设置连接字符串:
"DSN=MEASdata;UID=USER;PWD=PASSWORD;DBQ=MDMANU.WORLD;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T ;RST=T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=O;MLD =0;ODA=F;TSZ=8192;"
我需要建立变量 "wafer_id" '^WAFER_ID^' .........
设置一个循环来构建所需的 SQL 来收集所需的数据,一次一个晶圆......
打开数据库连接...
运行“munged”SQL ......
将所有数据收集到一张数据表. …………
断开与数据库的连接??
使用上面的简单示例,你们能否协助构建一个可以测试的脚本,以便我可以尝试自己处理更高级的案例。
此致,
菲利普
PS 请注意,这只是我想要做的一个简单示例,此数据采集需要几毫秒,而高级案例目前需要数小时到可能几天,因为我无法为“一个晶圆一次”提取数据时间”。
回复:如何在 JSL 脚本中使用的 SQL 中插入循环?谢谢杰夫的好建议。
这种特定的数据采集确实非常具有挑战性,并且需要仔细规划,因为数据是从包含许多 TB 数据的许多数据库表中检索的。
我们自己的 3 名数据库管理员以及 2 家外部公司都致力于优化。
这就是寻求这种“一次一个晶片”方法的原因。
这种方法最近被 Denodo 使用相同的 SQL 成功演示,但目前我们还没有可用的 Denodo s/w。
此致,
菲利普
回复:如何在 JSL 脚本中使用的 SQL 中插入循环?如果您在一个循环中运行许多 SQL 语句,您应该采用不同的方法:
数据库=打开数据库连接( “<您的连接字符串转到此处>” ) ;
对于每一行(
数据库= ...
执行sql (数据库,数据库) ;
) ;
关闭数据库连接(数据库) ;
这样你只连接到数据库一次,可以节省你一点时间。
回复:如何在 JSL 脚本中使用的 SQL 中插入循环?我还恭敬地建议您确保您的 SQL 得到适当优化。
作为埃里克希尔指出没有 JOIN 的查询通常会导致笛卡尔积将每个表的每一行与每个其他表的每一行相匹配。 这可能非常耗费时间和资源。 您提供的示例代码没有 JOIN。 如果这代表了您的实际代码,则可能值得研究您是否可以改进 SQL 和 JSL。
-杰夫
回复:如何在 JSL 脚本中使用的 SQL 中插入循环?嗨埃里克,
感谢您提供我试图为原始 SQL 修改的脚本。
长 SQL 字符串是从 wafers.jmp 中的晶圆列表创建的,但出于某种原因,我只能从一个晶圆中获得结果。
即使我多次复制一个晶圆 ID,我仍然只能得到一个晶圆的价值或测试结果。
希望我的理解是正确的...
我首先根据您的示例设置模板....
然后我设置了存储“wafers.jmp”的默认目录.....
设置循环......
对于每一行(
wafer_id = :WaferID;
sql = Eval Insert( sqlTemplate );
打印( sql );
);
连接到数据库并运行 sql ???
打开数据库(
"DSN=TESTING;UID=tepo;PWD=密码;DBQ=Production;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST =T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=O;MLD=0 ;ODA=F;TSZ=8192;",
评估插入(sql)
);
;
这是我不确定的最后一部分。
任何想法,建议。
好像我们很亲近。。。。
此致,
菲利普
回复:如何在 JSL 脚本中使用的 SQL 中插入循环?感谢罗恩的链接。
作为 JMP 和脚本的新手,我还没有完全理解其中的逻辑,但会尝试弄明白。
此致,
菲利普
回复:如何在 JSL 脚本中使用的 SQL 中插入循环?感谢罗恩的指点,这节省了我一些时间。因此,使用 Ron 指出的示例,我将感兴趣的晶圆 ID 放入名为 wafers.jmp 的数据表中,然后编写了以下脚本:
sql模板= “\[
选择
I.PRODUCTNR,
T.TESTUNITNR,
T.MEASUREMENTPOINTNR,
T.创作时间,
T.RESULT_PARAM1,
T.RESULT_PARAM2
从
“项目”D,
“测试结果”T,
“测试结果”TRR,
“测试”TR,
其中 I.IDNR = T.IDNR
AND T.TESTRESULTNR = TRR.TESTRESULTNR
AND TRR.TESTROWIDNR = TR.TESTROWIDNR
AND I.LOTIDNR = L.LOTIDNR
AND T.VALIDITY = '1'
AND D.WAFERNR = '^wafer_id^'
AND (T.TESTUNITNR LIKE ('HENE%')
和 TR.VARIABLENAME 在
( '阿塞纳姆',
'OFFSET_X_DIFF',
'OFFSET_Y_DIFF' )
;
]\" ;
打开( “wafers.jmp” ) ;
对于每一行(
wafer_id = :晶圆编号;
数据库=评估插入( sql模板 ) ;
打印( sql ) ;
) ;
当然,这只是打印出经过修改的 SQL;您可以添加代码以将 SQL 提交到您的数据库。
卫生部,
埃里克
回复:如何在 JSL 脚本中使用的 SQL 中插入循环?你好警察局,
也许这个例子很有用:
https://community.jmp.com/message/223900#223900
罗恩
回复:如何在 JSL 脚本中使用的 SQL 中插入循环?嘿,菲利普,
好的,抱歉,只是想确认一下。我将编写一个循环示例。
埃里克
回复:如何在 JSL 脚本中使用的 SQL 中插入循环?嗨埃里克。
谢谢你的关心。
如前所述,这是一个比原来短得多的虚拟 Sql。
我希望只是从 JSL 的角度而不是 SQL 的角度来展示这个案例。
Rgds
菲利普
回复:如何在 JSL 脚本中使用的 SQL 中插入循环?嘿,菲利普,
循环当然是可能的,但首先要注意的是:如所写,您的 SQL 语句生成笛卡尔积,这可能导致指数大小增加。那有必要吗?
埃里克