待,过滤数据,相同数据只取出两条,求SQL语句
在线等待,过滤数据,相同数据只取出两条,求SQL语句
SQL SERVER2000环境中,过滤相同的数据,如果没有相同的话取出全部数据,如果有相同的只取出最大的两条,同时把这两条数据排列成两列。 例如下面的数据中,Name1中值为1000的数据有8条,需要先过滤取出最大的两条(即ID=25和26的),然后把这两条数据由行转成列,而Name1中值为1002的数据只有一条,顾只需要取出来即可,求SQL语句
原始数据
ID NAME1 NAME2
1 1000 A
2 1000 B
3 1000 C
4 1001 D
5 1002 E
6 1003 F
7 1004 G
8 1005 H
9 1006 I
10 1007 J
11 1008 K
12 1009 L
13 1000 M
14 1001 N
15 1001 O
16 1008 P
17 1009 Q
18 1005 R
19 1005 S
20 1005 T
21 1008 U
22 1009 V
23 1000 W
24 1000 X
25 1000 Y
26 1000 Z
得到的结果如下
ID NAME1 NAME2 ID NAME1 NAME2
25 1000 Y 26 1000 Z
14 1001 N 15 1001 O
5 1002 E
6 1003 F
7 1004 G
19 1005 S 20 1005 T
9 1006 I
10 1007 J
16 1008 P 21 1008 U
17 1009 Q 22 1009 V
------解决思路----------------------
------解决思路----------------------
SQL SERVER2000环境中,过滤相同的数据,如果没有相同的话取出全部数据,如果有相同的只取出最大的两条,同时把这两条数据排列成两列。 例如下面的数据中,Name1中值为1000的数据有8条,需要先过滤取出最大的两条(即ID=25和26的),然后把这两条数据由行转成列,而Name1中值为1002的数据只有一条,顾只需要取出来即可,求SQL语句
原始数据
ID NAME1 NAME2
1 1000 A
2 1000 B
3 1000 C
4 1001 D
5 1002 E
6 1003 F
7 1004 G
8 1005 H
9 1006 I
10 1007 J
11 1008 K
12 1009 L
13 1000 M
14 1001 N
15 1001 O
16 1008 P
17 1009 Q
18 1005 R
19 1005 S
20 1005 T
21 1008 U
22 1009 V
23 1000 W
24 1000 X
25 1000 Y
26 1000 Z
得到的结果如下
ID NAME1 NAME2 ID NAME1 NAME2
25 1000 Y 26 1000 Z
14 1001 N 15 1001 O
5 1002 E
6 1003 F
7 1004 G
19 1005 S 20 1005 T
9 1006 I
10 1007 J
16 1008 P 21 1008 U
17 1009 Q 22 1009 V
------解决思路----------------------
CREATE TABLE #temp (ID int,NAME1 int,NAME2 CHAR(1))
INSERT INTO #temp
SELECT 1, 1000,'A' UNION ALL
SELECT 2, 1000,'B' UNION ALL
SELECT 3, 1000,'C' UNION ALL
SELECT 4, 1001,'D' UNION ALL
SELECT 5, 1002,'E' UNION ALL
SELECT 6, 1003,'F' UNION ALL
SELECT 7, 1004,'G' UNION ALL
SELECT 8, 1005,'H' UNION ALL
SELECT 9, 1006,'I' UNION ALL
SELECT 10, 1007,'J' UNION ALL
SELECT 11, 1008,'K' UNION ALL
SELECT 12, 1009,'L' UNION ALL
SELECT 13, 1000,'M' UNION ALL
SELECT 14, 1001,'N' UNION ALL
SELECT 15, 1001,'O' UNION ALL
SELECT 16, 1008,'P' UNION ALL
SELECT 17, 1009,'Q' UNION ALL
SELECT 18, 1005,'R' UNION ALL
SELECT 19, 1005,'S' UNION ALL
SELECT 20, 1005,'T' UNION ALL
SELECT 21, 1008,'U' UNION ALL
SELECT 22, 1009,'V' UNION ALL
SELECT 23, 1000,'W' UNION ALL
SELECT 24, 1000,'X' UNION ALL
SELECT 25, 1000,'Y' UNION ALL
SELECT 26, 1000,'Z'
SELECT a.*
,CASE WHEN a.id=a.id2 THEN '' ELSE CAST(b.id AS VARCHAR(10)) END id
,CASE WHEN a.id=a.id2 THEN '' ELSE CAST(b.name1 AS VARCHAR(10)) END name1
,CASE WHEN a.id=a.id2 THEN '' ELSE b.name2 END name2
FROM
(
SELECT a.*,B.id2
FROM #temp a
JOIN
(
select name1,MIN(id) id1,MAX(id) id2 from #temp t
where id IN (select TOP 2 id from #temp where name1=t.name1 ORDER BY id desc)
GROUP BY name1
) b ON a.id=b.id1
) a
JOIN #temp b ON a.id2=b.id
ORDER BY 2
------解决思路----------------------
--2000没有ROW_NUMBER(),只能用临时表的自增列来求最大、次大。
CREATE TABLE #temp1 (
i int identity,
id int,
name1 int,
name2 varchar(5)
)
GO
INSERT INTO #temp1 (id,name1,name2)
SELECT *
FROM table1
ORDER BY name1,name2 DESC,id
SELECT name1, MIN(i) i
INTO #temp2
FROM #temp1
GROUP BY name1
SELECT t1.id, t1.name1, t1.name2,
t2.id, t2.name1, t2.name2
FROM #temp2 t0
JOIN #temp1 t1
ON t1.i = t0.i
LEFT JOIN #temp1 t2
ON t2.i = t0.i+1
AND t2.name1 = t0.name1
DROP TABLE #temp1
DROP TABLE #temp2
id name1 name2 id name1 name2
----------- ----------- ----- ----------- ----------- -----
26 1000 Z 27 1000 Z
15 1001 O 14 1001 N
5 1002 E NULL NULL NULL
6 1003 F NULL NULL NULL
7 1004 G NULL NULL NULL
20 1005 T 19 1005 S
9 1006 I NULL NULL NULL
10 1007 J NULL NULL NULL
21 1008 U 16 1008 P
22 1009 V 17 1009 Q