zoukankan      html  css  js  c++  java
  • 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个自然年

    谢谢!

  • 相关阅读:
    Alone
    vue父组件中调用子组件的方法
    常用CSS的布局问题;
    Flex语法和常用鼠标手势
    如何解决浮动元素高度塌陷---CSS
    Vue中使用 iview 之-踩坑日记
    路由懒加载---Vue Router
    <input type="file">如何实现自定义样式
    sticky -- position定位属性sticky值之粘性定位;
    Vue组件传值(三)之 深层嵌套组件传值
  • 原文地址:https://www.cnblogs.com/chendongblog/p/10839927.html
Copyright © 2011-2022 走看看