免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1351 | 回复: 1
打印 上一主题 下一主题

如何实现这样的排序问题,请教了,谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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前面。
依此类推。

请问如何实现,谢谢了

论坛徽章:
0
2 [报告]
发表于 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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP