待,过滤数据,相同数据只取出两条,求SQL语句

在线等待,过滤数据,相同数据只取出两条,求SQL语句
本帖最后由 6962226 于 2015-01-15 16:51:33 编辑
SQL SERVER2000环境中,过滤相同的数据,如果没有相同的话取出全部数据,如果有相同的只取出最大的两条,同时把这两条数据排列成两列。 例如下面的数据中,Name1中值为1000的数据有8条,需要先过滤取出最大的两条(即ID=25和26的),然后把这两条数据由行转成列,而Name1中值为1002的数据只有一条,顾只需要取出来即可,求SQL语句

待,过滤数据,相同数据只取出两条,求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