MSSQL间隔4行取一条记录

时间:2022-06-01 19:40:45
现在有Table A,内容如下:
Columns1,Columns2
1       ,1
2       ,2
14      ,14
5       ,5
6       ,6
7       ,7
8       ,8
9       ,9
10      ,10
11      ,11
12      ,12
13      ,13
3       ,3
7       ,7
8       ,8

现在要得到的结果是:
5;9;13;14
n=[表的总行数\4]
也就是按Columns2的顺序排列
1,2,3,5,6,7,8,9,10,11,12,13,14

取出第4*1,第4*2...第4*n行,第n行Coulmns2的值.

那么该怎么做呢?
多谢了!

22 个解决方案

#1


-- sql 2005

SELECT Columns1,Columns2
FROM(
SELECT Columns1,Columns2,
row = ROW_NUMBER() OVER(ORDER BY Columns2)
FROM A
)AA 
WHERE (row - 1)%4 = 0

#2


--没有看见顺序排列在哪里

--如果没有标准递增序列,用下面语句

select id=identity(int,1,1),* into # from tableA
select columns1,columns2
from #
where id%5=4

#3


再附加一句:
Columns是惟一的!

#4


-- Columns是惟一的!
-- 则sql 2000可以用
SELECT Columns1,Columns2
FROM(
SELECT Columns1,Columns2,
row = (
SELECT COUNT(*) FROM A A1 
WHERE A1.Columns2 < A.Columns2 
OR A1.Columns2 = A.Columns2 AND A1.Columns1 <= A.Columns1)
FROM A 
)AA 
WHERE (row - 1)%4 = 0

#5


--  have a try!

select *

from #tableA a

where (select count(*)+1
       from #tableA
       where Columns2<a.Columns2)%4=0

#6


估计一下你的数据表有多少条记录,或者直接查询一下表有多少条记录。
然后生成一个临时表,假设有990条记录

select top 1000 identity(int) id into #t from sysobjects,syscolumns
--这里的top值大于你的记录数就可以了。如果你表中记录数够多,就cross join来生成#t

select a.* from TableA a
inner join #t b
on b.id%4=1 and a.id=(select count(1) from TableA x where x.Columns2<=a.Columns)

楼主的意思我猜大体是这样,具体是按col1 还是col2没太看明白,写法就是这样了,没测试,可能有手误。

#7


怎么搞的,每次多打几个字,发上来就有一堆回贴了,看来我要连习一下打字速度了

#8


select IDENTITY(int, 1,1) as myid,column1,column2 into #strack from table1
order by column2
select * from #strack
where myid%4=0

这个是一个朋友写得,我也放上去吧!
大家都可以有个参考

#9


select IDENTITY(int, 1,1) as myid,column1,column2 into #strack from table1
order by column2
select * from #strack
where myid%4=0
kentyshang的返回值是:5,8,11

-- Columns是惟一的!
-- 则sql 2000可以用
SELECT Columns1,Columns2
FROM(
SELECT Columns1,Columns2,
row = (
SELECT COUNT(*) FROM A A1 
WHERE A1.Columns2 < A.Columns2 
OR A1.Columns2 = A.Columns2 AND A1.Columns1 <= A.Columns1)
FROM A 
)AA 
WHERE (row - 1)%4 = 0
邹建你的返回值是:
1,6,12,8

select id=identity(int,1,1),* into # from tableA
select columns1,columns2
from #
where id%5=4
LouisXIV(夜游神) ,你的返回值是:
5,10,7

select *
from #tableA a
where (select count(*)+1
       from #tableA
       where Columns2<a.Columns2)%4=0

mschen(Co-ok)你的返回值是:
5,8,11,8

所以没有一个是正确的,哈哈!
大家再看一下了!

还有一个要问的是邹建:
row = ROW_NUMBER() OVER(ORDER BY Columns2)
是什么意思呢!

多谢,多谢!

#10


在多添加一句是我表述不清的关系:
table A表结构:

Columns1   ID (自动生成)
Columns2   INT(惟一的)

#11


没有一个正确的,看来我的也错了。

#12


to lz
尔所谓
Columns2   INT(惟一的)
----------------------
可确定是唯一?望自行检讨数据在先

#13


to lz

select *
from #tableA a
where (select count(*)+1
       from #tableA
       where Columns2<a.Columns2)%4=0

mschen(Co-ok)你的返回值是:
5,8,11,8
-------------------
以此观之,尔表中必存重复数据

#14


是呀!
最后一行多余了!
实在不好意思!
我也是刚才测试数据的时候才发现的!
道歉!道歉!

#15


select JRNUM from  #TB  where JRNUM % 4=0
的时候出现错误:

Server: Msg 206, Level 16, State 2, Line 1
Operand type *: int is incompatible with void type
Server: Msg 8117, Level 16, State 1, Line 1
Operand data type numeric is invalid for modulo operator.

  CREATE TABLE #TB(
JRNUM numeric(9) NULL)

要怎么修改呢!
多谢!多谢~

#16


CREATE TABLE #TB(
JRNUM INT NULL)

#17


select JRNUM from  #TB  where Convert(int,JRNUM) % 4=0
也可以呢!


谢谢大家!
我的问题解决了!
感谢大家!
我结贴了!

#18


再次感谢了!哈哈

#19


该回复被版主删除

#20


这个需求怪怪的……

#21


mark

#22


select JRNUM from  #TB  where Convert(int,JRNUM) % 4=0

我把1,2,3行数据删除掉,这个还准?????呵呵

#1


-- sql 2005

SELECT Columns1,Columns2
FROM(
SELECT Columns1,Columns2,
row = ROW_NUMBER() OVER(ORDER BY Columns2)
FROM A
)AA 
WHERE (row - 1)%4 = 0

#2


--没有看见顺序排列在哪里

--如果没有标准递增序列,用下面语句

select id=identity(int,1,1),* into # from tableA
select columns1,columns2
from #
where id%5=4

#3


再附加一句:
Columns是惟一的!

#4


-- Columns是惟一的!
-- 则sql 2000可以用
SELECT Columns1,Columns2
FROM(
SELECT Columns1,Columns2,
row = (
SELECT COUNT(*) FROM A A1 
WHERE A1.Columns2 < A.Columns2 
OR A1.Columns2 = A.Columns2 AND A1.Columns1 <= A.Columns1)
FROM A 
)AA 
WHERE (row - 1)%4 = 0

#5


--  have a try!

select *

from #tableA a

where (select count(*)+1
       from #tableA
       where Columns2<a.Columns2)%4=0

#6


估计一下你的数据表有多少条记录,或者直接查询一下表有多少条记录。
然后生成一个临时表,假设有990条记录

select top 1000 identity(int) id into #t from sysobjects,syscolumns
--这里的top值大于你的记录数就可以了。如果你表中记录数够多,就cross join来生成#t

select a.* from TableA a
inner join #t b
on b.id%4=1 and a.id=(select count(1) from TableA x where x.Columns2<=a.Columns)

楼主的意思我猜大体是这样,具体是按col1 还是col2没太看明白,写法就是这样了,没测试,可能有手误。

#7


怎么搞的,每次多打几个字,发上来就有一堆回贴了,看来我要连习一下打字速度了

#8


select IDENTITY(int, 1,1) as myid,column1,column2 into #strack from table1
order by column2
select * from #strack
where myid%4=0

这个是一个朋友写得,我也放上去吧!
大家都可以有个参考

#9


select IDENTITY(int, 1,1) as myid,column1,column2 into #strack from table1
order by column2
select * from #strack
where myid%4=0
kentyshang的返回值是:5,8,11

-- Columns是惟一的!
-- 则sql 2000可以用
SELECT Columns1,Columns2
FROM(
SELECT Columns1,Columns2,
row = (
SELECT COUNT(*) FROM A A1 
WHERE A1.Columns2 < A.Columns2 
OR A1.Columns2 = A.Columns2 AND A1.Columns1 <= A.Columns1)
FROM A 
)AA 
WHERE (row - 1)%4 = 0
邹建你的返回值是:
1,6,12,8

select id=identity(int,1,1),* into # from tableA
select columns1,columns2
from #
where id%5=4
LouisXIV(夜游神) ,你的返回值是:
5,10,7

select *
from #tableA a
where (select count(*)+1
       from #tableA
       where Columns2<a.Columns2)%4=0

mschen(Co-ok)你的返回值是:
5,8,11,8

所以没有一个是正确的,哈哈!
大家再看一下了!

还有一个要问的是邹建:
row = ROW_NUMBER() OVER(ORDER BY Columns2)
是什么意思呢!

多谢,多谢!

#10


在多添加一句是我表述不清的关系:
table A表结构:

Columns1   ID (自动生成)
Columns2   INT(惟一的)

#11


没有一个正确的,看来我的也错了。

#12


to lz
尔所谓
Columns2   INT(惟一的)
----------------------
可确定是唯一?望自行检讨数据在先

#13


to lz

select *
from #tableA a
where (select count(*)+1
       from #tableA
       where Columns2<a.Columns2)%4=0

mschen(Co-ok)你的返回值是:
5,8,11,8
-------------------
以此观之,尔表中必存重复数据

#14


是呀!
最后一行多余了!
实在不好意思!
我也是刚才测试数据的时候才发现的!
道歉!道歉!

#15


select JRNUM from  #TB  where JRNUM % 4=0
的时候出现错误:

Server: Msg 206, Level 16, State 2, Line 1
Operand type *: int is incompatible with void type
Server: Msg 8117, Level 16, State 1, Line 1
Operand data type numeric is invalid for modulo operator.

  CREATE TABLE #TB(
JRNUM numeric(9) NULL)

要怎么修改呢!
多谢!多谢~

#16


CREATE TABLE #TB(
JRNUM INT NULL)

#17


select JRNUM from  #TB  where Convert(int,JRNUM) % 4=0
也可以呢!


谢谢大家!
我的问题解决了!
感谢大家!
我结贴了!

#18


再次感谢了!哈哈

#19


该回复被版主删除

#20


这个需求怪怪的……

#21


mark

#22


select JRNUM from  #TB  where Convert(int,JRNUM) % 4=0

我把1,2,3行数据删除掉,这个还准?????呵呵