读书人

求教上这个SQL 如何实现排序

发布时间: 2012-08-03 00:12:14 作者: rapoo

求教下这个SQL 怎么实现排序
我是在.net 版块http://topic.csdn.net/u/20120704/15/fde6f34d-8b3c-4094-a378-23d755518aaa.html?8077
看到的,发现自己也不会写,求大牛指点下 这个SQL怎么写,我想过 row_number() over partition by 发现这个函数
只分了一次组排序,这个应该需要分2次组排序吧,一时感兴趣,自己也弄不出来求大牛 指教.
id name type date
1 jim 1 2012-02-01
2 bob 1 2012-02-01
3 bob 1 2012-02-01
n jim 1 2012-02-02
n bob 1 2012-02-02
4 jim 2 2012-02-01
5 bob 2 2012-02-01
6 bob 2 2012-02-01
n jim 2 2012-02-02
n bob 2 2012-02-02
7 bob 3 2012-02-01
8 bob 3 2012-02-01
9 bob 3 2012-02-01
n jim 3 2012-02-02
n bob 3 2012-02-02


我想处理成。

1 jim 1 2012-02-01
4 jim 2 2012-02-01
7 bob 3 2012-02-01
2 bob 1 2012-02-01
5 bob 2 2012-02-01
8 bob 3 2012-02-01
3 bob 1 2012-02-01
6 bob 2 2012-02-01
9 bob 3 2012-02-01


补充下。。。是这样

[解决办法]

SQL code
--> 测试数据:[test]if object_id('[test]') is not null drop table [test]create table [test]([id] varchar(1),[name] varchar(3),[type] int,[date] datetime)insert [test]select '1','jim',1,'2012-02-01' union allselect '2','bob',1,'2012-02-01' union allselect '3','bob',1,'2012-02-01' union allselect 'n','jim',1,'2012-02-02' union allselect 'n','bob',1,'2012-02-02' union allselect '4','jim',2,'2012-02-01' union allselect '5','bob',2,'2012-02-01' union allselect '6','bob',2,'2012-02-01' union allselect 'n','jim',2,'2012-02-02' union allselect 'n','bob',2,'2012-02-02' union allselect '7','bob',3,'2012-02-01' union allselect '8','bob',3,'2012-02-01' union allselect '9','bob',3,'2012-02-01' union allselect 'n','jim',3,'2012-02-02' union allselect 'n','bob',3,'2012-02-02'select * from (select *,px=ROW_NUMBER()over(partition by [type]order by id)from test where [id]<>'n')torder by px,[type]/*id    name    type    date    px1    jim    1    2012-02-01 00:00:00.000    14    jim    2    2012-02-01 00:00:00.000    17    bob    3    2012-02-01 00:00:00.000    12    bob    1    2012-02-01 00:00:00.000    25    bob    2    2012-02-01 00:00:00.000    28    bob    3    2012-02-01 00:00:00.000    23    bob    1    2012-02-01 00:00:00.000    36    bob    2    2012-02-01 00:00:00.000    39    bob    3    2012-02-01 00:00:00.000    3*/
[解决办法]
SQL code
--> 测试数据:[tb]IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]GO CREATE TABLE [tb]([id] VARCHAR(1),[name] VARCHAR(3),[type] INT,[date] DATETIME)INSERT [tb]SELECT '1','jim',1,'2012-02-01' UNION ALLSELECT '2','bob',1,'2012-02-01' UNION ALLSELECT '3','bob',1,'2012-02-01' UNION ALLSELECT 'n','jim',1,'2012-02-02' UNION ALLSELECT 'n','bob',1,'2012-02-02' UNION ALLSELECT '4','jim',2,'2012-02-01' UNION ALLSELECT '5','bob',2,'2012-02-01' UNION ALLSELECT '6','bob',2,'2012-02-01' UNION ALLSELECT 'n','jim',2,'2012-02-02' UNION ALLSELECT 'n','bob',2,'2012-02-02' UNION ALLSELECT '7','bob',3,'2012-02-01' UNION ALLSELECT '8','bob',3,'2012-02-01' UNION ALLSELECT '9','bob',3,'2012-02-01' UNION ALLSELECT 'n','jim',3,'2012-02-02' UNION ALLSELECT 'n','bob',3,'2012-02-02'--------------开始查询--------------------------SELECT * FROM [tb] ORDER BY [date],[name] DESC ,type----------------结果----------------------------/* id   name type        date---- ---- ----------- -----------------------1    jim  1           2012-02-01 00:00:00.0004    jim  2           2012-02-01 00:00:00.0002    bob  1           2012-02-01 00:00:00.0003    bob  1           2012-02-01 00:00:00.0005    bob  2           2012-02-01 00:00:00.0006    bob  2           2012-02-01 00:00:00.0007    bob  3           2012-02-01 00:00:00.0008    bob  3           2012-02-01 00:00:00.0009    bob  3           2012-02-01 00:00:00.000n    jim  1           2012-02-02 00:00:00.000n    jim  2           2012-02-02 00:00:00.000n    jim  3           2012-02-02 00:00:00.000n    bob  1           2012-02-02 00:00:00.000n    bob  2           2012-02-02 00:00:00.000n    bob  3           2012-02-02 00:00:00.000(15 行受影响)*/ 


[解决办法]

SQL code
--> 测试数据:[test]if object_id('[test]') is not null drop table [test]create table [test]([id] varchar(1),[name] varchar(3),[type] int,[date] datetime)insert [test]select '1','jim',1,'2012-02-01' union allselect '2','bob',1,'2012-02-01' union allselect '3','bob',1,'2012-02-01' union allselect 'n','jim',1,'2012-02-02' union allselect 'n','bob',1,'2012-02-02' union allselect '4','jim',2,'2012-02-01' union allselect '5','bob',2,'2012-02-01' union allselect '6','bob',2,'2012-02-01' union allselect 'n','jim',2,'2012-02-02' union allselect 'n','bob',2,'2012-02-02' union allselect '7','bob',3,'2012-02-01' union allselect '8','bob',3,'2012-02-01' union allselect '9','bob',3,'2012-02-01' union allselect 'n','jim',3,'2012-02-02' union allselect 'n','bob',3,'2012-02-02'select     id,    name,    [type],    convert(varchar(10),[date],120) [date]from    (        select             *,            px=ROW_NUMBER()over(partition by [type]order by id)        from             test         where             [id]<>'n'    )torder by     px,[type]/*id    name    type    date---------------------------------1    jim    1    2012-02-014    jim    2    2012-02-017    bob    3    2012-02-012    bob    1    2012-02-015    bob    2    2012-02-018    bob    3    2012-02-013    bob    1    2012-02-016    bob    2    2012-02-019    bob    3    2012-02-01*/
[解决办法]
SQL code
--> 测试数据:[tb]IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]GO CREATE TABLE [tb]([id] VARCHAR(1),[name] VARCHAR(3),[type] INT,[date] DATETIME)INSERT [tb]SELECT '1','jim',1,'2012-02-01' UNION ALLSELECT '2','bob',1,'2012-02-01' UNION ALLSELECT '3','bob',1,'2012-02-01' UNION ALLSELECT 'n','jim',1,'2012-02-02' UNION ALLSELECT 'n','bob',1,'2012-02-02' UNION ALLSELECT '4','jim',2,'2012-02-01' UNION ALLSELECT '5','bob',2,'2012-02-01' UNION ALLSELECT '6','bob',2,'2012-02-01' UNION ALLSELECT 'n','jim',2,'2012-02-02' UNION ALLSELECT 'n','bob',2,'2012-02-02' UNION ALLSELECT '7','bob',3,'2012-02-01' UNION ALLSELECT '8','bob',3,'2012-02-01' UNION ALLSELECT '9','bob',3,'2012-02-01' UNION ALLSELECT 'n','jim',3,'2012-02-02' UNION ALLSELECT 'n','bob',3,'2012-02-02'--------------开始查询--------------------------SELECT * FROM(SELECT *,row=ROW_NUMBER() over(PARTITION BY type ORDER BY [date]) FROM [tb] ) tORDER BY row,type----------------结果----------------------------/* id   name type        date                    row---- ---- ----------- ----------------------- --------------------1    jim  1           2012-02-01 00:00:00.000 14    jim  2           2012-02-01 00:00:00.000 17    bob  3           2012-02-01 00:00:00.000 12    bob  1           2012-02-01 00:00:00.000 25    bob  2           2012-02-01 00:00:00.000 28    bob  3           2012-02-01 00:00:00.000 23    bob  1           2012-02-01 00:00:00.000 36    bob  2           2012-02-01 00:00:00.000 39    bob  3           2012-02-01 00:00:00.000 3n    jim  1           2012-02-02 00:00:00.000 4n    jim  2           2012-02-02 00:00:00.000 4n    jim  3           2012-02-02 00:00:00.000 4n    bob  1           2012-02-02 00:00:00.000 5n    bob  2           2012-02-02 00:00:00.000 5n    bob  3           2012-02-02 00:00:00.000 5(15 行受影响)*/
[解决办法]
用的一楼的表结构
SQL code
select id,name,type,convert(char(10),date,23) as date from (select *,RANK()over(partition by type order by id ) as row from test where id<>'n') aorder by row,type------------结果如下:----------1    jim    1    2012-02-014    jim    2    2012-02-017    bob    3    2012-02-012    bob    1    2012-02-015    bob    2    2012-02-018    bob    3    2012-02-013    bob    1    2012-02-016    bob    2    2012-02-019    bob    3    2012-02-01 

读书人网 >SQL Server

热点推荐