SQL技巧->多重分组排序的思路

如果有这样一个需求

求股票每年最高价格中的最低价格

应该怎么做呢

 1 drop table if exists #a
 2 create table #a (symbol varchar(10),price int,tdate varchar(10))
 3 insert into #a 
 4 (symbol,price,tdate) -- 该行可以省略 因为values是全部依次对应的
 5 values
 6 ('001',15,'20180301'),
 7 ('001',17,'20180501'),
 8 ('001',12,'20190601'),
 9 ('001',14,'20190801'),
10 ('002',20,'20180301'),
11 ('002',25,'20180501'),
12 ('002',22,'20190601'),
13 ('002',24,'20190801')
14 
15 select * from #a
16 select symbol,price,tdate from(
17     select * ,rn2=row_number()over(partition by symbol order by price asc) -- 外层第二次排序
18     from
19     (
20         select * from -- 内层第一次排序
21         (
22             select * ,rn1=row_number()over(partition by symbol,left(tdate,4) order by price desc) from #a
23         )a where rn1=1
24     )a
25 )a where rn2=1
26     
27 drop table #a

结果如下图

 

内层排序的分组依据是symbol和年份(tdate的前四位)

结果是每只代码每年的最高价格

内层排序后的结果

然后进行外层排序 这时候的分组依据是symbol

结果是每只代码每年最高价格中的最低价格

这个思路适用于每次分组和排序的规则不同的时候

只是提供一个通用的思路 实际问题并不会这么简单

应用场景之一 : 求债券或主体评级中每家评级机构的最新评级中的最低评级

应用场景之二 : 求最近一个自然年债券或主体评级中每家评级机构的最新评级中的最低评级 , 没有评级则往前追溯一个自然年 ,最多追溯3个自然年

谢谢!

 

posted @ 2019-05-09 17:41  布里塔  阅读(2077)  评论(0编辑  收藏  举报