现在有这样一张表 table1
id Name No1 No2
1 A 1 -1
1 B 1 1
------------------------
2 A 2 -2
2 B 2 2
------------------------
3 A 3 -3
3 B -1 3
------------------------
4 A 4 1
4 B -2 4
------------------------
5 A -1 2
5 B 1 5
------------------------
6 A -1 -1
6 B 2 6
表的No1跟No2的规律是一样的
每多一条数据,他就自身加1或者-1
或者回到自己的初始值,初始值就是1或者是-1
他的上一条数据为负数,初始值就是1
他的上一条数据为正数,他的初始值就是-1比如现在No1 是3 下一条可能是4
但是也有可能下一条变成-1或者No2 现在是-2 下一条可能是-3
但是也可能变成1
id Name No1 No2
100 A 3 -2
------------------------
101 A 4 -3
------------------------
102 A -1 1
------------------------
103 A -2 -1
------------------------
104 A 1 -2
------------------------
想求一个思路,把这个表里的最大值统计出来,但是不能取重复的
比如No1:1 2 3 -1 -2 -3 -4 1 2 3 4 5 6 7 -1 -2 -3 -4 -5 -6 1 2 3 4
这里边要取得就是 3 -4 7 -6 4不知道说明白了没有,有什么疑问都问我
适用sql统计
id Name No1 No2
1 A 1 -1
1 B 1 1
------------------------
2 A 2 -2
2 B 2 2
------------------------
3 A 3 -3
3 B -1 3
------------------------
4 A 4 1
4 B -2 4
------------------------
5 A -1 2
5 B 1 5
------------------------
6 A -1 -1
6 B 2 6
表的No1跟No2的规律是一样的
每多一条数据,他就自身加1或者-1
或者回到自己的初始值,初始值就是1或者是-1
他的上一条数据为负数,初始值就是1
他的上一条数据为正数,他的初始值就是-1比如现在No1 是3 下一条可能是4
但是也有可能下一条变成-1或者No2 现在是-2 下一条可能是-3
但是也可能变成1
id Name No1 No2
100 A 3 -2
------------------------
101 A 4 -3
------------------------
102 A -1 1
------------------------
103 A -2 -1
------------------------
104 A 1 -2
------------------------
想求一个思路,把这个表里的最大值统计出来,但是不能取重复的
比如No1:1 2 3 -1 -2 -3 -4 1 2 3 4 5 6 7 -1 -2 -3 -4 -5 -6 1 2 3 4
这里边要取得就是 3 -4 7 -6 4不知道说明白了没有,有什么疑问都问我
适用sql统计
如果这条数据时1或者-1,那就是取它的前一条数据的值
然后存到另外一个表
现在是因为有很多指标 A,B,C……N No1,No2,No3……NoN计算起来效率很低
然后按照你提出的规律过滤即可。
IF OBJECT_ID('a') IS NOT NULL
DROP TABLE aCREATE TABLE a
(
id INT,
NAME VARCHAR(20),
no1 INT,
no2 INT)INSERT INTO a
SELECT '1','A',1,-1 UNION ALL
SELECT '2','A',2,-2 UNION ALL
SELECT '3','A',3,-3 UNION ALL
SELECT '4','A',4,-4 UNION ALL
SELECT '5','A',-1,-5 UNION ALL
SELECT '6','A',-2,-6 UNION ALL
SELECT '7','A',-3,-7 UNION ALL
SELECT '8','A',-4,-8 UNION ALL
SELECT '9','A',1,-9 UNION ALL
SELECT '10','A',2,1 UNION ALL
SELECT '11','A',-1,2 UNION ALL
SELECT '12','A',-2,3
SELECT
t2.*,
(SELECT TOP 1 no1
FROM a WHERE t2.NAME = NAME AND id<t2.id ORDER BY id desc ) AS aa
FROM a t2
WHERE No1 =1 OR no1 = -1
/*(12 行受影响)
id NAME no1 no2 aa
----------- -------------------- ----------- ----------- -----------
1 A 1 -1 NULL
5 A -1 -5 4
9 A 1 -9 -4
11 A -1 2 2(4 行受影响)*/
这里头尾还得稍微处理一下,你可以自己再稍稍修改一下
DROP TABLE tb
GOCREATE TABLE tb(id INT,NAME VARCHAR(20),no1 INT)INSERT INTO tb
SELECT '1','A',1 UNION ALL
SELECT '2','A',2 UNION ALL
SELECT '3','A',3 UNION ALL
SELECT '4','A',-1 UNION ALL
SELECT '5','A',-2 UNION ALL
SELECT '6','A',-3 UNION ALL
SELECT '7','A',-4 UNION ALL
SELECT '8','A',1 UNION ALL
SELECT '9','A',2 UNION ALL
SELECT '10','A',3 UNION ALL
SELECT '11','A',4 UNION ALL
SELECT '12','A',5 UNION ALL
SELECT '13','A',6 UNION ALL
SELECT '14','A',-1 UNION ALL
SELECT '15','A',-2 UNION ALL
SELECT '16','A',-3 UNION ALL
SELECT '17','A',-4select a.id,a.no1 from tb a left join tb b on a.id = b.id - 1 where abs(a.no1) > abs(isnull(b.no1,0))/*
id no1
----------- -----------
3 3
7 -4
13 6
17 -4(4 行受影响)
*/
insert into tb1
select 1,'A',1,-1 union all select 1,'B',1,1 union all
select 2,'A',2,-2 union all select 2,'B',2,2 union all
select 3,'A',3,-3 union all select 3,'B',-1,3 union all
select 4,'A',4,1 union all select 4,'B',-2,4 union all
select 5,'A',-1,2 union all select 5,'B',1,5 union all
select 6,'A',-1,-1 union all select 6,'B',2,6;
with t as (
select id,name,no1,
max(abs(no1)) over (partition by name,id-abs(no1)) max1
from tb1
)
select id,name,no1 from t where abs(max1)=abs(no1);
/*
4 A 4
5 A -1
6 A -1
2 B 2
4 B -2
6 B 2
*/-- no2 同样处理drop table tb1;