求相邻数据的各种查询SQL语句!!!

lxctb888 2014-06-28 12:43:34
测试表mytable中字段分别为
ID Num D
1 636555 17
2 636549 14
3 636548 14
4 636547 14
5 636534 2
6 636545 8
7 636544 16
8 636543 13
9 636542 13
10 636541 16
11 636540 18
12 636539 21
13 636538 19
14 636537 12
15 636536 10
16 636545 8
17 636532 16
18 636550 14
19 636535 25
20 636530 11

(注意:Num不连续相邻)

【1】第一种查询:求字段Num连续相邻且字段D重复的数据,并且要求显示出重复数据的个数。
显示结果要求是这样
ID Num D GS(个数)
2 636550 14 4
3 636549 14 4
4 636548 14 4
5 636547 14 4
8 636543 13 2
9 636542 13 2

【PS:今晚就这一个问题,后续会有更加精彩的查询....
...全文
355 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
以学习为目的 2014-06-30
  • 打赏
  • 举报
回复
引用 3 楼 lxctb888 的回复:
[quote=引用 1 楼 galenkeny 的回复:]
declare @galenkeny table(ID INT IDENTITY(1,1),Num NUMERIC,D INT)
insert into @galenkeny
SELECT  '636555','17' union all
select  '636549','14' union all
select  '636548','14' union all 
select  '636547','14' union ALL
select  '636534','2' union ALL
select  '636545','8' union ALL
select  '636544','16' union ALL
select  '636543','13' union ALL
select  '636542','13' union ALL
select  '636541','16' union ALL
select  '636540','18' union ALL
select  '636539','21' union ALL
select  '636538','19' union ALL
select  '636537','12' union ALL
select  '636536','10' union ALL
select  '636545','8' union ALL
select  '636532','16' union ALL
select  '636550','14' union ALL
select  '636535','25' union ALL
select  '636530','11' 

--SELECT  *  FROM @galenkeny
;WITH cte AS
(
SELECT  *,rn=DENSE_RANK()OVER(PARTITION BY D  ORDER BY Num) 
FROM @galenkeny 
),
cte1 AS 
(
SELECT  *  FROM cte a
WHERE a.D IN(SELECT D FROM cte GROUP BY D HAVING COUNT(D)>=2)
)

SELECT n.ID,n.Num,n.D,v.GS FROM 
(
SELECT  D,COUNT(*)AS GS FROM @galenkeny 
WHERE D IN
(
     SELECT  g.D  FROM 
(
SELECT  MAX(Num)ma_num ,MIN(Num)mi_num ,MAX(rn) ma_rn,MIN(rn)mi_rn,D D 
FROM  cte1  
GROUP BY D
HAVING MAX(rn)<>MIN(rn) AND MAX(Num)-MIN(Num)=MAX(rn)-MIN(rn)
)g 
)
GROUP BY D
)v,
@galenkeny n
WHERE v.D=n.D
ORDER BY n.D DESC
*****************************
ID	Num	D	GS
18	636550	14	4
2	636549	14	4
3	636548	14	4
4	636547	14	4
8	636543	13	2
9	636542	13	2
*****************************
首先很感谢这位朋友,其次是SQL没有问题,但是在我的数据库里运行查询结果为0,也就是没有查询到数据。不知道这是为什么?[/quote] 那就按照where条件一个一个的屏蔽掉然后再查
lxctb888 2014-06-28
  • 打赏
  • 举报
回复
引用 1 楼 galenkeny 的回复:
declare @galenkeny table(ID INT IDENTITY(1,1),Num NUMERIC,D INT)
insert into @galenkeny
SELECT  '636555','17' union all
select  '636549','14' union all
select  '636548','14' union all 
select  '636547','14' union ALL
select  '636534','2' union ALL
select  '636545','8' union ALL
select  '636544','16' union ALL
select  '636543','13' union ALL
select  '636542','13' union ALL
select  '636541','16' union ALL
select  '636540','18' union ALL
select  '636539','21' union ALL
select  '636538','19' union ALL
select  '636537','12' union ALL
select  '636536','10' union ALL
select  '636545','8' union ALL
select  '636532','16' union ALL
select  '636550','14' union ALL
select  '636535','25' union ALL
select  '636530','11' 

--SELECT  *  FROM @galenkeny
;WITH cte AS
(
SELECT  *,rn=DENSE_RANK()OVER(PARTITION BY D  ORDER BY Num) 
FROM @galenkeny 
),
cte1 AS 
(
SELECT  *  FROM cte a
WHERE a.D IN(SELECT D FROM cte GROUP BY D HAVING COUNT(D)>=2)
)

SELECT n.ID,n.Num,n.D,v.GS FROM 
(
SELECT  D,COUNT(*)AS GS FROM @galenkeny 
WHERE D IN
(
     SELECT  g.D  FROM 
(
SELECT  MAX(Num)ma_num ,MIN(Num)mi_num ,MAX(rn) ma_rn,MIN(rn)mi_rn,D D 
FROM  cte1  
GROUP BY D
HAVING MAX(rn)<>MIN(rn) AND MAX(Num)-MIN(Num)=MAX(rn)-MIN(rn)
)g 
)
GROUP BY D
)v,
@galenkeny n
WHERE v.D=n.D
ORDER BY n.D DESC
*****************************
ID	Num	D	GS
18	636550	14	4
2	636549	14	4
3	636548	14	4
4	636547	14	4
8	636543	13	2
9	636542	13	2
*****************************
首先很感谢这位朋友,其次是SQL没有问题,但是在我的数据库里运行查询结果为0,也就是没有查询到数据。不知道这是为什么?
以学习为目的 2014-06-28
  • 打赏
  • 举报
回复
引用 楼主 lxctb888 的回复:
测试表mytable中字段分别为 ID Num D 1 636555 17 2 636549 14 3 636548 14 4 636547 14 5 636534 2 6 636545 8 7 636544 16 8 636543 13 9 636542 13 10 636541 16 11 636540 18 12 636539 21 13 636538 19 14 636537 12 15 636536 10 16 636545 8 17 636532 16 18 636550 14 19 636535 25 20 636530 11 (注意:Num不连续相邻) 【1】第一种查询:求字段Num连续相邻且字段D重复的数据,并且要求显示出重复数据的个数。 显示结果要求是这样 ID Num D GS(个数) 2 636550 14 4 3 636549 14 4 4 636548 14 4 5 636547 14 4 8 636543 13 2 9 636542 13 2 【PS:今晚就这一个问题,后续会有更加精彩的查询....
你期望的结果中ID和Num对应有问题,和你给出的数据不一致。我按照给出的数据写的
以学习为目的 2014-06-28
  • 打赏
  • 举报
回复
declare @galenkeny table(ID INT IDENTITY(1,1),Num NUMERIC,D INT)
insert into @galenkeny
SELECT  '636555','17' union all
select  '636549','14' union all
select  '636548','14' union all 
select  '636547','14' union ALL
select  '636534','2' union ALL
select  '636545','8' union ALL
select  '636544','16' union ALL
select  '636543','13' union ALL
select  '636542','13' union ALL
select  '636541','16' union ALL
select  '636540','18' union ALL
select  '636539','21' union ALL
select  '636538','19' union ALL
select  '636537','12' union ALL
select  '636536','10' union ALL
select  '636545','8' union ALL
select  '636532','16' union ALL
select  '636550','14' union ALL
select  '636535','25' union ALL
select  '636530','11' 

--SELECT  *  FROM @galenkeny
;WITH cte AS
(
SELECT  *,rn=DENSE_RANK()OVER(PARTITION BY D  ORDER BY Num) 
FROM @galenkeny 
),
cte1 AS 
(
SELECT  *  FROM cte a
WHERE a.D IN(SELECT D FROM cte GROUP BY D HAVING COUNT(D)>=2)
)

SELECT n.ID,n.Num,n.D,v.GS FROM 
(
SELECT  D,COUNT(*)AS GS FROM @galenkeny 
WHERE D IN
(
     SELECT  g.D  FROM 
(
SELECT  MAX(Num)ma_num ,MIN(Num)mi_num ,MAX(rn) ma_rn,MIN(rn)mi_rn,D D 
FROM  cte1  
GROUP BY D
HAVING MAX(rn)<>MIN(rn) AND MAX(Num)-MIN(Num)=MAX(rn)-MIN(rn)
)g 
)
GROUP BY D
)v,
@galenkeny n
WHERE v.D=n.D
ORDER BY n.D DESC
*****************************
ID	Num	D	GS
18	636550	14	4
2	636549	14	4
3	636548	14	4
4	636547	14	4
8	636543	13	2
9	636542	13	2
*****************************

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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