各位高手、前辈、大侠:
小弟最近学习写SPSS的程序,已经有了些进步,可以把数据库的一些数据(不超过65000行)保存在Excel文件中,并用 SPLIT FILE LAYERED BY xxx 进行分组计算了,还成功地把分组后的回归结果导出到文件中。
但现在遇到些问题,看上去只差一点点了,又实在绕不过去,查了挺多的资料,包括 Command Syntax Reference,SPSS Programming and Data Management 4th Edition,都没查到,只好请教各位高手、前辈、大侠了。
我现在的问题是:下一个回归计算的任务有 2百多万条数据,分为9千多组(数据最多的组约有7千多条数据),我以前尝试过这些办法,都不行:
1. 用 ODBC 连数据库,用SQL查出所有的数据,也用 SPLIT FILE LAYERED BY xxx 进行分组计算,当数据量只有几千行时,可以完成计算,到了几万行,就死在那里,一个晚上什么输出也没有
2. 把文件保存在 Excel 或 DBF 中,Excel 有数据行数的限制(不能超过65000多行),即使没有限制,数据量大就会使计算一直死在那里,什么输出也没有
3. 想写个循环,循环体中,只从数据库中取出一组数据(SQL的where条件中,嵌入循环变量的值),结果是:“在 GET data 之前,不能使用 Loop 语句”。原文如下:
>Error # 100. Command name: loop
>This command is not permitted before the beginning of file definition commands.
>This command not executed.
我的代码如下:
A. 用 ODBC 连数据库,用SQL查出所有的数据,也用 SPLIT FILE LAYERED BY xxx 进行分组计算,当数据量只有几千行时,可以完成计算的:
GET data
/TYPE=ODBC
/CONNECT= 'DSN=xx_MS_SQL;Description=GJ_3_MS_SQL;UID=xx;PWD=xx;APP=SPSS For Wind' +
'ows;WSID=xxx;Network=DBMSSOCN'
/SQL = ' '+
' SELECT h.ID, h.LOCATION_ID, h.HOUSE_AREA, h.AVERAGE_PRICE ' +
' FROM house h ' +
' WHERE h.LOCATION_ID <= 5 -- 为了减少数量 ' +
' order by h.LOCATION_ID '
.
CACHE.
DATASET NAME DataSet1 WINDOW=FRONT.
SPLIT FILE
SEPARATE BY LOCATION_ID .
OMS
/DESTINATION FORMAT = TEXT
OUTFILE = 'E:\WorkFile\回归\Result_01.txt' viewer = no .
REGRESSION
/MISSING LISTWISE
/STATISTICS COEFF OUTS R
/CRITERIA=PIN(.05) POUT(.10)
/NOORIGIN
/DEPENDENT AVERAGE_PRICE
/METHOD=ENTER HOUSE_AREA
/CASEWISE PLOT(ZRESID) ALL .
OMSEND.
B. 使用 Excel 中的数据的:
GET data
/Type = XLS
/CellRange = Full
/ReadNames = On
/File = 'E:\WorkFile\待回归_01.xls' .
PRESERVE.
SET TVARS NAMES TNUMBERS VALUES.
SPLIT FILE LAYERED BY LOCATION_ID.
DATASET DECLARE tempdata.
OMS …… 后面都同
C. 尝试写循环,在循环体中,只从数据库中取出一组数据(SQL的where条件中,嵌入循环变量的值)的:
* loop varLoc = 1 to 2. 写这句就报错 .
* compute varLoc = 1. 写这句也报错 . 这两行注解掉,是可以正常执行的
GET data
/TYPE=ODBC
/CONNECT= 'DSN=xx_MS_SQL;Description=GJ_3_MS_SQL;UID=xx;PWD=xx;APP=SPSS For Wind' +
'ows;WSID=xxx;Network=DBMSSOCN'
/SQL = ' '+
' SELECT h.ID, h.LOCATION_ID, h.HOUSE_AREA, h.AVERAGE_PRICE ' +
' FROM house h ' +
' WHERE h.LOCATION_ID = 1 -- 1 是一个特定的 LOCATION_ID,希望用循环取每个LOCATION_ID 的数据 ' +
' order by h.LOCATION_ID '
.
…… CACHE、OMS 等部分,同前
* end loop.
写 compute 会报:
>Error # 100. Command name: compute
>This command is not permitted before the beginning of file definition commands.
>This command not executed.
写 loop 会报:
>Error # 100. Command name: loop
>This command is not permitted before the beginning of file definition commands.
>This command not executed.
多谢 各位高手、前辈、大侠 的指教啊!