如果有这样一个需求

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

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

应该怎么做呢

 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

结果如下图

SQL技巧->双重排序的思路 随笔 第1张

 

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

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

内层排序后的结果

SQL技巧->双重排序的思路 随笔 第2张

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

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

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

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

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

谢谢!

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄