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個自然年

謝謝!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM