如何將循環插入到 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 語句會生成笛卡爾積,這可能會導致大小呈指數增長。有必要嗎?
埃里克