Chinaunix
标题:
如何实现这样的排序问题,请教了,谢谢
[打印本页]
作者:
tonyjet
时间:
2009-05-18 18:01
标题:
如何实现这样的排序问题,请教了,谢谢
请教一个关于排序的问题,谢谢
原数据如下:
ID LEVEL YEAR
------- ---------- -----------
com1 A 2008
com2 B 2008
com1 A 2007
com2 C 2007
com3 D 2008
com2 A 2006
com3 E 2007
com3 F 2006
……
……
……
ID:公司代码
LEVEL:公司评级的结果
YEAR:评级的年份
同一个ID不会有相同的YEAR,同一ID的YEAR可能不连续。
公司很多,只举例3个。
不同公司的年份会不一样,大概有近10年的记录。
ID LEVEL YEAR
------- ---------- -----------
com2 B 2008
com3 D 2008
com1 A 2008
com2 C 2007
com3 E 2007
com1 A 2007
com2 A 2006
com3 F 2006
1. 按照YEAR倒序排列时,LEVEL字段同上一年的LEVEL进行比较,如果LEVEL有变化,则此行记录靠前。
2. LEVEL没有变化的,靠后;
3. 如果没有上一年的记录时,再靠后
4. 以上相同时,按照ID正序
比如说公司com1,它2008年和2007年评级结果都是A,没有变化;
公司com3,它2008年和2007年评级结果分别是D和E,有变化,
那么YEAR=2008的记录排序时,公司com3就排在公司com1前面。
依此类推。
请问如何实现,谢谢了
作者:
liwd1977
时间:
2009-05-20 12:57
标题:
有点麻烦,但也可以实现
没有自己实现,只是一些想法,应该可以实现
第一步:获得是否变化的变量
create table t1
as
select id,level,year,lead(level) over(partition by id order by id,year,level desc) nextlevel
from table;
第二步:如果相邻的两个level相同,打个标记值1,否则置0
alter table t1 add flag char(1);
update t1 set flag='1' where level<>nextlevel;
update t1 set flag='0' where level=nextlevel;
第三步:关联回原表排序
select a.id,a.year,a.level
from table a,t1 b
where a.id=b.id
and a.level=b.level
and a.year=b.year
order by b.flag,a.id,a.year,a.level desc
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2