SQL轉矩陣<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />大家好,
是否可以將數據庫中的數據直接提取到矩陣中而無需先將其導入數據表?
謝謝!
回复:SQL 到矩陣感謝您的評論。
我有一個龐大的信用卡公司數據庫數據集,大約有一百萬用戶,每個用戶都有幾千個觀察結果。
我一次下載每個用戶並分析他的行為模式(這是大 for 循環)。
當我一次手動運行一個用戶時,它運行良好。 當運行超過 20 個用戶時,它會在沒有任何解釋的情況下隨機崩潰(程序剛剛關閉,或者我得到“jmp 執行了訪問衝突”)。我在魯棒性方面不斷改進我的命令,但仍然試圖找到最薄弱的環節。
羅恩
回复:SQL 到矩陣我忘了提一下,使用 'Select *' 肯定會降低查詢性能。在 for 循環中使用它是死刑。永遠不要在 SQL 中偷懶,輸入所有要提取的列,即使是表中的每一列。你會看到你的代碼運行得更快了。
回复:SQL 到矩陣非常感謝您,
現在我的腳本運行得更快並且問題更少。
羅恩
回复:SQL 到矩陣是的,你需要 eval 插入,我沒想到。
回复:SQL 到矩陣您確實需要 evalinsert ,因為您每次都在通過循環評估 i 。
回复:SQL 到矩陣謝謝你,
這很有幫助!
我的 SQL 語句只是我從手動打開表中復制的粗略腳本。
我想我設法得到了大部分,除了 Eval Insert。 沒有它我該怎麼辦?
這是我當前的腳本。
數據庫連接=創建數據庫連接(
"DBQ=D:\MY DOCUMENTS\;DefaultDir=D:\MY DOCUMENTS\;Driver={Microsoft 文本驅動程序 (*.txt;*.csv)};DriverId=27;FIL=text;FILEDSN=D:\My Documents\SQLLog Data.dsn;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;"
) ;
// 在矩陣中提取用戶 ID 號:
用戶矩陣= ( dt100 =執行 SQL (數據庫連接, “從 data.csv 中選擇不同的用戶 ID” , “dt10 - 用戶 ID 列表” ,無形的)) <<得到矩陣;
關( dt100 ,不保存) ;
sqlstr = “選擇 * FROM data.csv 其中用戶 ID = ^id^” ;
為了(一世= 1 ,一世<= N行(用戶矩陣) ,一世++,
ID =用戶矩陣[一世] ;
dt10i =執行 SQL (數據庫連接,
評估插入( sqlstr ) ,
“用戶數據記錄” ||字符(一世) || “——” ||字符( ID ) ,無形的) ;
// 分析數據表 //
關( dt10i ,沒有保存) ;
) ;
關閉數據庫連接(數據庫連接) ;
回复:SQL 到矩陣幾件事。
首先,將您的第一個查詢更改為“SELECT DISTINCT UserId From dataset.csv”;
這做了兩件事,使您的查詢更快,而且由於您將其作為矩陣拉取,Usermatrix 現在將 = UniqueID 切割幾行代碼。 這消除了存儲未使用的可能非常大的列表和矩陣(用戶列表/用戶矩陣)的需要。只是但一定要在 for 循環中將 nitems 更改為 nrows。
其次,不需要每次都在 for 循環中建立數據庫連接。使用 dbconnection = 創建數據庫連接(dsn);其中 dsn 是您上面的長查詢字符串。然後將 Open Database(...) 更改為 Execute SQL(dbconnection, sqlstr, "Log Data User " || Char(i), invisible)。
有幾點可以從中受益,您將節省每次連接到數據庫的時間(這應該會節省很多時間)。您不需要 eval insert() sqlstr,這沒什麼大不了的,但少了一步。 最後,也很重要的是,不可見地打開 dt10i 將節省大量內存空間,幫助您的代碼運行得更快。特別是如果您在“執行分析”部分操作數據表。我看到你最終還是關閉了它。要使腳本運行得更快,請務必記住,您計劃關閉的任何數據表都應該以不可見或私有模式打開。
確保有一個關閉數據庫連接(數據庫連接);在您的代碼末尾。
回复:SQL 到矩陣謝謝msharp,
也許我之前應該分享過我的腳本。
歡迎任何建議。
用戶矩陣= ( dt100 =開放數據庫(
"DBQ=D:\MY DOCUMENTS;DefaultDir=D:\MY DOCUMENTS;Driver={Microsoft 文本驅動程序 (*.txt; *.csv)};DriverId=27;FIL=text;FILEDSN=D:\My Documents\ SQLLog Data.dsn;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;" ,
// 下一行將只從數據集中提取 UserId 以減少內存使用。
“從 dataset.csv 中選擇用戶 ID” ,
“dt10 - 用戶 ID 列表” ,
無形的
// 私有 // 這個選項不起作用!!!
)) <<得到矩陣;
關( dt100 ,不保存) ;
// 識別用戶和他們的ID號
用戶列表=關聯數組(用戶矩陣) ;
唯一身份=用戶列表<<獲取密鑰;
//
// 這只是字符串中的一個語句
sqlstr = “選擇 * FROM dataset.csv 其中 id = ^i^” ;
// 遍歷數據集並一次提取一個單獨的數據。
為了(一世= 1 ,一世<= N 項(唯一身份) ,一世++,
// 使用語句為每個用戶提取個人日誌。
dt10i =開放數據庫(
"DBQ=D:\MY DOCUMENTS;DefaultDir=D:\MY DOCUMENTS;Driver={Microsoft 文本驅動程序 (*.txt; *.csv)};DriverId=27;FIL=text;FILEDSN=D:\My Documents\ SQLLog Data.dsn;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;" ,
評估插入( sqlstr ) ,
“日誌數據用戶” ||字符(一世) ,
) ;
// 執行分析 ...//
關( dt10i ,沒有保存) ;
) ;
回复:SQL 到矩陣聽起來你可以優化你的 SQL 語句。
就像是:
使用 IDtemp 作為(從 IDtable 中選擇 IDcol,其中 IDcol = 'FilterCriteria')
從 IDtable 中選擇 *
內連接 IDtemp
這將首先創建一個臨時 IDtemp 表,SQL 使用該表來加入更大的 IDtable。內連接大大減少了 SQL 必須處理的表的大小。當然,可能有更簡單的方法可以讓它更快。一切都取決於數據的存儲方式和表的大小。
我將專注於優化您的 SQL 語句,而不是優化 JMP 交互和提取數據的方式。
回复:SQL 到矩陣謝謝msharp,
這讓我更清楚我沒有錯過任何東西。
問題是數據源很大,我只需要獲取 ID 列表(一列)。 之後,我為每個 ID 提取數據(許多列)並分別分析。打開整個數據集是不可行的。
羅恩
回复:SQL 到矩陣嗯,是的,也不是。您可以使用以下命令將其作為矩陣直接導入 JSL:
matrix = 執行 SQL(dsn, sql_string, table_name, invisible) << 獲取矩陣;
但是,執行 SQL 語句仍然會創建一個數據表。 如果“私有”是一個選項,那麼它是可能的,因為如果私有數據表沒有存儲在某個地方,JMP 會自動從您的計算機內存中清除它們。 唉,隱形是他們給我們的最好的。
您可以使用以下腳本關閉不可見表。在所有實用性中,它會一樣快,因為執行 SQL 語句將始終是瓶頸。
matrix = (dt = Execute SQL(dsn, sql_string, table_name, invisible)) << 獲取矩陣;
關閉(dt);