数据名次排列问题

downloadok 2005-10-25 08:40:05
数据源:
数据1 数据2 数据3 数据4
118 131 120 116
107 124 119 99
111 117 107 97
103 116 93 74
101 122 97 82
103 124 98 73
97 107 93 82
105 95 100 90
104 93 101 82

数据 排名 数据 排名 数据 排名 数据 排名
118 1 131 1 120 1 116 1
107 3 124 2 119 2 99 2
111 2 117 5 107 3 97 3
103 6 116 6 93 8 74 8
101 8 122 4 97 7 82 5
103 6 124 2 98 6 73 9
97 9 107 7 93 8 82 5
105 4 95 8 100 5 90 4
104 5 93 9 101 4 82 5
以上是想得到的结果,即根据各列数据(从数据表得到各列数据)进行排列,得到排名.用ASP如何快速实现排列????
我已用asp编程实现,可大数据量时速度有些慢!
程序段
arrrecord=rs.getrows()
for I=0 to 数据列数
for j=1 to 数据记录行数-1
for k=j+1 to 数据记录行数
if arrrecord(j,i)<arrrecord(k,i) then
arrsort(j,i)=arrsort(j,i)+1
else if arrrecord(j,i)>arrrecord(k,i) then
arrsort(k,i)=arrsort(k,i)+1 then
end if
end if
next
next
next

求高手帮助!!!!!
...全文
149 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
downloadok 2005-10-27
  • 打赏
  • 举报
回复
我试过用程序来实现了,可数据量不大时,速度还可以接受,可是数据量大时,就簋慢,受不了,毕竟所有的数据都要读取到数据组里.再进行比较再排序再确定排名呀.
dh20156 2005-10-27
  • 打赏
  • 举报
回复
ACCESS里没办法使用存储过程,你就用语句来执行吧。或者看看用程序来排序而不通过语句来解决,我想你用ACCESS的话用程序来实现可能会快点,搜索一下冒泡。
downloadok 2005-10-27
  • 打赏
  • 举报
回复
那如何在ASP+ACCESS下创建存储进程和创建临时表呢?请写出实现语句。以上是在SQL SERVER里的语句呀,
dh20156 2005-10-27
  • 打赏
  • 举报
回复
这样好办:
--创建存储过程
Create Procedure csort
As
Create Table #t1(caid int identity(1,1),cavalue int)
Create Table #t2(cbid int identity(1,1),cbvalue int)
Insert into #t1 Select t1 As cavalue From test1 Order by t1 DESC
Insert into #t2 Select t2 As cavalue From test1 Order by t2 DESC
Select a.t1,MIN(ta.caid) AS caid,a.t2,MIN(tb.cbid) AS tbid From test1 a left outer join #t1 ta on a.t1=ta.cavalue left outer join #t2 tb on a.t2=tb.cbvalue Group by a.t1,a.t2
GO

--创建表
Create Table test1(t1 int,t2 int)

--插入数据
Insert Into test1
Select 118,131 union
Select 107,124 union
Select 111,117 union
Select 111,116

--查询记录
exec csort

--删除存储过程
Drop Procedure csort

--删除表
Drop Table test1

--结果
/*
t1 caid t2 tbid
111 2 116 4
111 2 117 3
107 4 124 2
118 1 131 1
*/
downloadok 2005-10-27
  • 打赏
  • 举报
回复
按 dh20156(风之石)的贴测试后没能实现要求:
如结果
111 2
108 3
111 2
120 1
而想得到是如下这样的结果
111 2
108 4
111 2
120 1
另请问一下如何在ASP+ACCESS数据库环境下创建存储过程,创建临时表。
downloadok 2005-10-26
  • 打赏
  • 举报
回复
测试后加分
downloadok 2005-10-26
  • 打赏
  • 举报
回复
再次谢谢dh20156(风之石)
dh20156 2005-10-26
  • 打赏
  • 举报
回复
那样的话更应该用存储过程了。
对了,上边的执行结果没有按照你给定的预期那样排序,建议你在[数据源]那个表里加个标识列,那样就可以按你的要求排序了。
downloadok 2005-10-26
  • 打赏
  • 举报
回复
真诚感谢 dh20156(风之石)的热心帮助.不过如果要处理的数据列项很多时(如几十项时),编写的语句代码就很麻烦了.
dh20156 2005-10-26
  • 打赏
  • 举报
回复
--创建存储过程
Create Procedure csort
As
Create Table #t1(caid int identity(1,1),cavalue int)
Create Table #t2(cbid int identity(1,1),cbvalue int)
Insert into #t1 Select distinct t1 As cavalue From test1 Order by t1 DESC
Insert into #t2 Select distinct t2 As cavalue From test1 Order by t2 DESC
Select a.t1,ta.caid,a.t2,tb.cbid From test1 a left outer join #t1 ta on a.t1=ta.cavalue left outer join #t2 tb on a.t2=tb.cbvalue
GO

--创建表
Create Table test1(t1 int,t2 int)

--插入数据
Insert Into test1
Select 118,131 union
Select 107,124 union
Select 111,117 union
Select 111,116

--查询记录
exec csort

--删除存储过程
Drop Procedure csort

--删除表
Drop Table test1

--结果
/*
t1 caid t2 cbid
107 3 124 2
111 2 116 4
111 2 117 3
118 1 131 1
*/
cashsoft 2005-10-26
  • 打赏
  • 举报
回复
order buy desc就可以了啊
downloadok 2005-10-26
  • 打赏
  • 举报
回复
能详细具体地写出程序段吗???谢谢!!!!
dh20156 2005-10-25
  • 打赏
  • 举报
回复
不想去调试了,你参考一下吧:
估计要用到临时表,先考虑用4个吧,每列用一个,存储每列的值,还一个标识字段,如:
#t1
caid cavalue
1 118
2 111
3 107
. ...

其他三个也类似,最后再查询:

Select a.[数据1],ta.caid,a.[数据2],tb.cbid,a.[数据3],tc.ccid,a.[数据4],td.cdid From [数据源] a left outer join #t1 ta on a.[数据1]=ta.cavalue left outer join #t2 tb on a.[数据2]=tb.cbvalue left outer join #t3 tc on a.[数据3]=tc.ccvalue left outer join #t4 td on a.[数据4]=td.cdvalue
dh20156 2005-10-25
  • 打赏
  • 举报
回复
没那么简单。
downloadok 2005-10-25
  • 打赏
  • 举报
回复
如果用order by,如何用语句实现呢?
rym1020 2005-10-25
  • 打赏
  • 举报
回复
晕撒。。sql不是有order by吗。。为什么不用呢。
order by了之后读取每个数据的指针序号,不就排好了序吗,然后再按照原来的数据顺序输出
dh20156 2005-10-25
  • 打赏
  • 举报
回复
你在插入到临时表中酱紫的话就可以解决了:

Insert into #t1 Select distinct [数据1] As cavalue From [数据源] Order by [数据1] DESC

其他类似。
你的这个问题最好放在一个存储过程里解决。
downloadok 2005-10-25
  • 打赏
  • 举报
回复
这样做还不能达到要求,如果两个数据相同,如
118 1
111 2
111 3
107 4
而想要的结果是
118 1
111 2
111 2
107 4
不过还是先谢了 dh20156(风之石)的热心帮助
分支程序设计,循环程序设计,子程序结构 1、练习逻辑运算指令、比较指令和条件转移指令的功能、用法以及与标志位的关系和可用的寻址方式 2、用地址表法,完成下面要求的多分支程序的设计。根据MODE单元中的模式字(0-7)分别转向L0-L7标号处执行。L0-L7处分别完成显示‘0’-‘7’字符。 当MODE=0时,转L0标号,完成显示‘0’ 当MODE=1时,转L1标号,完成显示‘1’ 当MODE=2时,转L2标号,完成显示‘2’ 当MODE=3时,转L3标号,完成显示‘3’ 当MODE=4时,转L4标号,完成显示‘4’ 当MODE=5时,转L5标号,完成显示‘5’ 当MODE=6时,转L6标号,完成显示‘6’ 当MODE=7时,转L7标号,完成显示‘7’ 3、编制程序实现如下操作: 设有10个学生成绩,分别统计低于60分、60~69分、70~79分、80~89分、90~99分及100分的人数,并存放于S5、S6、S7、S8、S9、S10单元中。 实验六: 1. 请编写一程序,从附加段中一个未排序的字数组中,找出最大数和最小数分别存放在AX 和BX寄存器中。 2. 以GRADE为首地址的10个字的数组中保存有学生成绩。建立一个10个字的RNAK 数组,并根据GRADE中的学生成绩将学生名次填入RANK数组中(提示:一个学生的名次等于成绩高于等于该学生的人数加1)。 寄存器分配情况说明如下: AX 存放当前被测学生的成绩 BX 存放当前被测学生的相对地址指针 CX 内循环计数值 DX 存放当前被测学生的名次计数值 SI 内循环测试时的地址指针 DI 外循环计数值 3、数组DATAX,其中的数据排列规律是:头三项是0,0,1,以 每项的值均是前三项之和。试将项值小于等于2000以前的各项数据填入数组DATAX中。 算法: n≥ 4时: ① an=an-1+an-2+an-3 ② an=2an-1—an-4 要求:按上述两种算法编程 4、从DATA_BUF(1000H)开始存放50个字节数据,编写程序将这些数据由小到大排序,排序后的数据仍放在该区域中。 要求原始数据在源程序中给出,排序前后的数据以每行10个的格式显示在屏幕上。 5、测量一字符串长度,并用十六进制数显示之

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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