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