一个存储过程(100分)

  • 主题发起人 主题发起人 snpl
  • 开始时间 开始时间
S

snpl

Unregistered / Unconfirmed
GUEST, unregistred user!
有表
id num
4 04
4 07
4 10
4 16
4 21
4 27
3 03
3 09
3 13
3 21
3 27
3 29
2 15
2 20
2 22
2 23
2 27
2 31
1 05
1 18
1 20
1 24
1 26
1 31
......
用存储过程如何实现从最大ID向前(ID连续)相同num出现次数最多的 如上表中得到27连续出现3次
 
select coung(*) SameNum from table group by Num where ID > X
 
你把你的要求在说明白些
 
从最大ID向前连续出现的num,也就是说id=4的num中出现在id=3的num中的是27,然后看是不是27出现在id=2的num中,直到找不到为止
 
select Top 1 A.Num,Max(A.SumNum/A.Num) as MaxNum from (select Num,sum(Num) as SumNum from table1 group by Num) A group by A.Num order by MaxNum desc
 
存储过程:
1,加一个临时表(id,num),存入要处理的数据范围
2,建立一个游标,两组变量(@OldNum,@OldCount,@CurNum,@CurCount),
set @OldNum=0,set @OldCount = 0,取出最大ID第一个mum,计算他向前连续的最大次数存入,@CurNum,@CurCount。
3,然后,@OldCount,@CurCount进行比较,如果 @OldCount < @CurCount,那么set @OldNum=@CurNum,set @OldCount = @CurCount
4,如此循环,最后的@OldNum,@OldCount将试你要的值
 
select * from tt
drop table tt1
go

create table tt1(id int,num int)

bulk insert test2..tt1
from 'd:/1.txt'
WITH (
DATAFILETYPE = 'char',
FIELDTERMINATOR = ' ',
ROWTERMINATOR = '/n'
)


create procedure p_getmax
(@id int)
as
begin

select * from
(select count(*) as ss,num from tt1 where id > @id group by num) A
where
ss=(select max(ss) from (select count(*) as ss,num from tt1 where id> @id group by num ) B)

end

exec p_getmax 1

测试通过.
 
to:weichao9999
对你这种方法不怎么理解,能否具体说说,谢了
 
没有SQL SERVER,自己测试吧

DECLARE @resultNum INT --返回的数字
DECLARE @oldCount INT --返回的次数
DECLARE @newCount INT --第二个计数器

DECLARE @dealID INT --处理中的id
DECLARE @dealNum INT --处理中的num


--取得ID范围
DECLARE @bigID INT
DECLARE @smallID INT
SELECT TOP 1 @bigID=id FROM YOURTABLE ORDER BY ID DESC
SELECT TOP 1 @smallID=id FROM YOURTABLE ORDER BY ID ASC

--取得数量大于1的num
SELECT DISTINCT(num)
INTO #MYTEMP
FROM YOURTABLE
HAVING COUNT(*) > 2 --忘记了,可能是这样吧

--NND,怕你小丫听儿的num都是1个玩儿我
SELECT TOP 1 @resultNum = num FROM YOURTABLE ORDER BY num DESC
SET @oldCount = 1

//遍历表 表里面没数字的时候退出
WHILE (SELECT COUNT(*) FROM #MYTEMP)>0
BEGIN
//取得一个数字
SELECT TOP 1 @dealNum = num
FROM #MYTEMP

SET @newCount = 0

//按照id遍历
SET @dealID = @bigID
WHILE (@dealID >= @smallID)
BEGIN
IF (SELECT COUNT(*) FROM YOURTABLE WHERE id = @dealID AND num = @dealNum) > 0
BEGIN
//没找到就从0开始计
SET @newCount = 0
END
ELSE
BEGIN
//找到了加1,如果大那就算记下次数和数字
SET @newCount = @newCount + 1
IF (@oldCount < @newCount) THEN
BEGIN
SET @oldCount = @newCount
SET @resultNum = @dealNum
END
END
SET @dealID = @dealID - 1
END

//删除一个数字
DELETE FROM #MYTEMP
WHERE num = @dealNum
END

PRINT '册那,不知道是不是:'+CONVERT(NVARCHAR(10), @resultNum)+'出现了'+CONVERT(NVARCHAR(10), @oldCount)+'次'
 
//没找到就从0开始计
这里还可以加一句话稍微提高点效率的
 
其实就是遍历查找,找到最符合条件的
 
没分么?
 
多人接受答案了。
 
后退
顶部