27,580
社区成员
发帖
与我相关
我的任务
分享
;WITH T AS
(
SELECT ROW_NUMBER() OVER(ORDER BY GETDATE()) AS Rid,* FROM dbo.ss WHERE col4='BH' and col2='A'
),TS AS(
SELECT (Rid*2-1)AS 'Aid',a.*,'start' AS [single],Rid*2 AS 'Cid',c.col1 AS c1, c.col2 AS c2, c.ID AS i2, c.col3 AS c3, c.col4 AS c4,[singlec] FROM T a
OUTER APPLY(
SELECT TOP 1 *,'end' AS [singlec]FROM dbo.ss b WHERE b.col3 = a.col3 AND b.ID>a.ID AND b.col2 in ('CN','EN')
) c
)
SELECT aid,col1,col2,id,col3,col4,[single] FROM TS --WHERE Aid % 2 <> 0
UNION ALL
SELECT cid ,c1,c2,i2,c3,c4,[singlec] FROM TS --WHERE c1 IS NOT NULL
ORDER BY 1
col1 col2 ID col3 col4
a A 1 400-1 BH
b NULL 2 400-2 NULL
c A 3 400-1 BH
d NULL 4 400-1 NULL
e EN 5 400-1 BF
f B 6 400-3 NULL
g CN 7 400-1 NULL
g A 8 400-6 BH
f NULL 9 400-3 NULL
--第一对记录
a A 1 400-1 BH
e EN 5 400-1 BF
--第二对记录
c A 3 400-1 BH
e EN 5 400-1 BF
--第三对记录
g A 8 400-6 BH
--合起来就是结果,顺序就是上面所讲的一条记录开始一条记录结束:
a A 1 400-1 BH
e EN 5 400-1 BF
c A 3 400-1 BH
e EN 5 400-1 BF
g A 8 400-6 BH
--当然这只是第一种结果的排序,第二种结果的排序也是一样,一条开始一条结束,找不到就结束
col1 col2 ID col3 col4
a A 1 400-1 BH
b NULL 2 400-2 NULL
c A 3 400-1 BH
d NULL 4 400-1 NULL
e EN 5 400-1 BF
f B 6 400-3 NULL
g CN 7 400-1 NULL
g A 8 400-6 BH
f NULL 9 400-3 NULL
--第一对记录
a A 1 400-1 BH
e EN 5 400-1 BF
--第二对记录
c A 3 400-1 BH
e EN 5 400-1 BF
--第三对记录
g A 8 400-6 BH
--合起来就是结果,顺序就是上面所讲的一条记录开始一条记录结束:
a A 1 400-1 BH
e EN 5 400-1 BF
c A 3 400-1 BH
e EN 5 400-1 BF
g A 8 400-6 BH
create table T
(col1 varchar(1),
col2 varchar(2),
ID int,
col3 varchar(10),
col4 varchar(2))
insert into T
select 'a','A','1','400-1','BH' union all
select 'b',NULL,'2','400-2',NULL union all
select 'c','B','3','400-3','BF' union all
select 'd',NULL,'4','400-1',NULL union all
select 'e','B','5','400-2','BH' union all
select 'f','B','6','400-3',NULL union all
select 'g','CN','7','400-1',NULL union all
select 'g','EN','8','400-1',NULL union all
select 'f',NULL,'9','400-3',NULL union all
select 'x','CN','10','400-1',NULL union all
select 's','EN','11','400-1',NULL union all
select 'h',NULL,'12','400-3',NULL union all
select 'b','CN','13','400-5',NULL union all
select 'f','EN','14','400-6',NULL union all
select 'x','CN','15','400-1',NULL union all
select 's','EN','16','400-1',NULL union all
select 'b',NULL,'17','400-3',NULL union all
select 'v','A','18','400-3','BF'
select * from T where col4='BH' and col2='A'
union all
select top 1 * from T where col3 in (select col3 from T where col4='BH' and col2='A') and col2 in ('CN','EN')
union all
select * from T where col4='BH' and col2='B'
union all
select top 1 * from T where col3 > (select col3 from T where col4='BH' and col2='B') and col2 in ('CN','EN')
-- LZ要的结果.
col1 col2 ID col3 col4
---- ---- ----------- ---------- ----
a A 1 400-1 BH
g CN 7 400-1 NULL
e B 5 400-2 BH
b CN 13 400-5 NULL
with c1 as
(
select * from T where col4='BH' and col2='A'
union all
select top 1 * from T where T.col3=c1.col3 and col2 in ('CN','EN')
)
select * from c1
--现有一表,数据如下
--源表[T]
col1 col2 ID col3 col4
a A 1 400-1 BH
b NULL 2 400-2 NULL
c B 3 400-3 BF
d NULL 4 400-1 NULL
e B 5 400-2 BH
f B 6 400-3 NULL
g CN 7 400-1 NULL
g EN 8 400-1 NULL
f NULL 9 400-3 NULL
x CN 10 400-1 NULL
s EN 11 400-1 NULL
h NULL 12 400-3 NULL
b CN 13 400-5 NULL
f EN 14 400-6 NULL
x CN 15 400-1 NULL
s EN 16 400-1 NULL
b NULL 17 400-3 NULL
v A 18 400-3 BF
--在这张表中找出列col4中为BH的行,接着在找出的记录中分两种情况进行进一步的查找。
--注意:ID列是已经按从小到大排序,且是唯一的
--第一种情况是col4列的值是BH且col2列的值是A如下
col1 col2 ID col3 col4
a A 1 400-1 BH
--第一种情况查找过程:根据上一记录中col3列的值400-1在往后列col3所有都为400-1的记录,筛选出col2列中最先出现CN或EN的记录。
d NULL 4 400-1 NULL
g CN 7 400-1 NULL
g EN 8 400-1 NULL
x CN 10 400-1 NULL
s EN 11 400-1 NULL
x CN 15 400-1 NULL
s EN 16 400-1 NULL
--第一种情况的最终结果
col1 col2 ID col3 col4
a A 1 400-1 BH
g CN 7 400-1 NULL
--第二种情况稍微有些不同,col4列的值是BH且col2的值是B,如下:
col1 col2 ID col3 col4
e B 5 400-2 BH
--第二种情况查找过程:这里查找的是与400-2相同的记录,而是比400-2要大的所有记录并从中筛选出col2列中最先出现CN或EN的记录。
f B 6 400-3 NULL
f NULL 9 400-3 NULL
b CN 13 400-5 NULL
f EN 14 400-6 NULL
b NULL 17 400-3 NULL
v A 18 400-3 BF
--第二种情况的最终结果
col1 col2 ID col3 col4
e B 5 400-2 BH
b CN 13 400-5 NULL
--实际的结果就是两种情况的结果联合起来
col1 col2 ID col3 col4
a A 1 400-1 BH
g CN 7 400-1 NULL
e B 5 400-2 BH
b CN 13 400-5 NULL