请教个数据提取问题.

dawugui 2007-12-05 10:24:34
状况:

oracle9i数据库(也有SQL数据库的,是哪个无所谓).
两个表,
student学生表(id 学生号) 70 - 100万条记录
score分数表(id 学生号 , itemid 题号 , score 分数) 2000 - 3000万条记录

-----------------------------------------
要求:

两表id连接,同时对分数进行转换(如 score when 0 then A when 0.5 then B when 1 then C when 1.5 then D when 2 then E when 2.5 then F end,只有这六种)

如何能快速的按照上诉要求提取数据并将数据保存(DBF,TXT,XLS,这个大家不用考虑,我自己有代码).

目前,我用PB写的循环提取数据,花费时间约3.5个小时.
(如果石头来了,看看PB有没有好点的办法.)

注意:1)如果直接写SQL语句,会造成服务器内存不足.
2)不能直接打开库提取数据,数据是保密的.

...全文
349 34 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
yowbell 2007-12-09
  • 打赏
  • 举报
回复
没能力解决,但帮顶~~
starsong 2007-12-07
  • 打赏
  • 举报
回复
我觉得能不能通过先吧不同等级的分数分类取到零时表中再进行处理
ainy360 2007-12-06
  • 打赏
  • 举报
回复
没试过,留个标记
spgoal 2007-12-06
  • 打赏
  • 举报
回复
有select权限就可以了
andy84 2007-12-05
  • 打赏
  • 举报
回复
mark
dawugui 2007-12-05
  • 打赏
  • 举报
回复
顶起.下午来看.

谢熊哥.
dobear_0922 2007-12-05
  • 打赏
  • 举报
回复
数据转换好像没有什么更好的方法了,,,
create table score(id bigint, score float)

declare @i int
declare @temp int
set @i=0
while @i<1000000
begin
set @temp=abs(checksum(newid()))
insert score select @temp%100, @temp%6*0.5
set @i=@i+1
end


declare @time datetime
select @time=getdate()
select *, 'ABCDEF'=char(score*2+65) from score
print datediff(ms,@time,getdate())

select @time=getdate()
select *, 'ABCDEF'=case score when 0 then 'A'
when 0.5 then 'B'
when 1 then 'C'
when 1.5 then 'D'
when 2 then 'E'
when 2.5 then 'F' end
from score
print datediff(ms,@time,getdate())

drop table score

/* Messages
(1000000 row(s) affected)
13350

(1000000 row(s) affected)
13893
*/



dawugui 2007-12-05
  • 打赏
  • 举报
回复
先挂这里,大家再想想.
-狙击手- 2007-12-05
  • 打赏
  • 举报
回复
导出当然用BCP来生成,现在关键是转换与提取数据 
w2jc 2007-12-05
  • 打赏
  • 举报
回复
先做个记号
DemonXHunter 2007-12-05
  • 打赏
  • 举报
回复
建议写一个函数 fn_ScoreToRank 完成这个转化
然后用SQL的bcp或者 oracle的导出命令来进行导出,这样速度会比较快,比如SQL的方法如下

bcp "select student.*, fn_ScoreToRank(score1), fn_ScoreToRank(score2)... from student, score where student.id = score.id" queryout data.txt -n -r \n -t \t -T"
其中-r \n -t 和 \t -T 分别控制换行符和字段分隔符。


-狙击手- 2007-12-05
  • 打赏
  • 举报
回复
如果是SQL,没有rownum这个东东,临时生成可麻烦。另外:学号不好分,是全国各地都有,而且从学号中不能区分是哪个省市的。



----


大体上分批,并不是严格10000一次,缩短一次处理的时间
所以你的学号不要区分 哪个省呀
playwarcraft 2007-12-05
  • 打赏
  • 举报
回复
我是覺得,大數據處理分2步來比較好,先server處理完數據。
然后程序來直接抓數據。
程序抓完一部分,可以釋放內存,就不會造成out of memory的情況了.
playwarcraft 2007-12-05
  • 打赏
  • 举报
回复

所以就將其存入臨時表,加上標示自增id欄位.

这个花费多少时间?
===========================================
今天怎么了,頁面刷不開,。。。。。

我在我們的服務器上轉,數據處理還蠻快的。沒幾分鐘吧。。。
處理的過程比較單純,也就是列轉行,行數固定,所以用union all的方式。
比如
select id=identity(int,1,1),col1
into tmp_T
from
(
select col1 from T
union all
select col2 from T
union all
....
) T

dawugui 2007-12-05
  • 打赏
  • 举报
回复
oracle可以搞,有rownum返回序号。10000个一次,可以考虑。
先利用视图把分数转换,这个也可以考虑。
石头,再想想。

如果是SQL,没有rownum这个东东,临时生成可麻烦。另外:学号不好分,是全国各地都有,而且从学号中不能区分是哪个省市的。
-狙击手- 2007-12-05
  • 打赏
  • 举报
回复
注意要让where用上索引
-狙击手- 2007-12-05
  • 打赏
  • 举报
回复
按学号分呀
dawugui 2007-12-05
  • 打赏
  • 举报
回复
石头,在PB中可以分批提取数据处理看看.

如何搞?先把学生排个号,每次搞10000个?
-狙击手- 2007-12-05
  • 打赏
  • 举报
回复
那先对score做视图转换成绩
dawugui 2007-12-05
  • 打赏
  • 举报
回复
我发现目前时间主要是花费在对分数的转换上.
加载更多回复(14)

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧