17,086
社区成员
发帖
与我相关
我的任务
分享
with tmp as
(select a,row_number() over(order by rn desc, a) as rn
from(select a,a-row_number()over(order by a) rn from tab where b=0)
)
select *
from tab
where a between (select a+1 from tmp where rn = (select max(rn) from tmp)) and (select a-1 from tmp where rn = (select min(rn) from tmp));
select *
from tab
where a between
(select a + 1
from (select a,row_number() over(order by rn desc, a) as rn from(select a,a-row_number()over(order by a) rn from tab where b=0))
where rn = (select max(rn)
from(select a,row_number() over(order by rn desc, a) as rn
from(select a,a-row_number()over(order by a) rn from tab where b=0)
)
)
)
and
(select a - 1
from (select a,row_number() over(order by rn desc, a) as rn
from(select a,a-row_number()over(order by a) rn from tab where b=0)
)
where rn = (select min(rn)
from(select a,row_number() over(order by rn desc, a) as rn
from(select a,a-row_number()over(order by a) rn from tab where b=0)
)
)
);
--测试数据
IF OBJECT_ID('#tab') IS NOT NULL
DROP TABLE #tab
CREATE TABLE #tab(
a INT,
b int
)
INSERT INTO #tab
SELECT 1,0 UNION ALL
SELECT 2,0 UNION ALL
SELECT 3,9 UNION ALL
SELECT 4,0 UNION ALL
SELECT 5,8 UNION ALL
SELECT 6,0 UNION ALL
SELECT 7,0
--测试数据结束
--Oracle很少用,大概的思路就是下面这样的。不知道这MSSql的你能不能看懂哈
--步骤2:以下面的子查询结果为基础,按rn倒序,a正序再产生一个新的rownumber(新rn),结果集插入一个临时表#Tab2
SELECT a,
ROW_NUMBER() OVER(ORDER BY rn DESC, a) AS rn
--INTO #tab2
FROM (
--步骤1:找出所有b字段为0的数据,a减去rownumber(按a字段排序产生一个rownumber)得到一个值rn
SELECT a,
a -ROW_NUMBER() OVER(ORDER BY a) AS rn
FROM #tab
WHERE b = 0
-- a rn
------------- --------------------
--1 0
--2 0
--4 1
--6 2
--7 2
) a
-- a rn
------------- --------------------
--6 1
--7 2
--4 3
--1 4
--2 5
--步骤3:Between最大的rn值对应的a字段的值+1(也就是3) And 最小的rn的值对应的a字段的值-1(也就是5)
SELECT *
FROM #tab
WHERE a BETWEEN
(
SELECT a + 1
FROM #tab2
WHERE rn = (
SELECT MAX(rn)
FROM #tab2
)
)
AND
(
SELECT a - 1
FROM #tab2
WHERE rn = (
SELECT MIN(rn)
FROM #tab2
)
)
-- a b
------------- -----------
--3 9
--4 0
--5 8
--(3 行受影响)
这是SQL Server的代码,不知道能不能理解哈,但是逻辑都是一样,你理解了我写的那些注释的话自己写出来就没问题了,挺简单的
create table tmp as
select 1 A, 0 B from dual union all
select 2 A, 0 B from dual union all
select 3 A, 12 B from dual union all
select 4 A, 0 B from dual union all
select 5 A, 5 B from dual union all
select 6 A, 0 B from dual;
select a,b
from(
select a,b,
row_number()over(order by a) rn1,
row_number()over(order by a desc) rn2
from tmp
)
where rn1 <> 1
and rn2 <>1
order by a;
select a,b
from(
select a,b,
row_number()over(order by a) rn1,
row_number()over(order by a dec) rn2
from table_name
) where rn1 <> 1
and rn2 <>1