新浪博客

ROW_NUMBER分析函数实例

2016-12-01 01:34阅读:
最近在《新造船管理软件——NBSMS软件开发项目中发现一句比较实用的sql语句:
SELECT * FROM (SELECT *,num=ROW_NUMBER() OVER(PARTITION BY 分段号,检验项目 ORDER BY 计划结束日期 desc ) FROM [201分段报验记录表] WHERE HullNo='OC400K' ) a WHERE num=1
出于好奇,我上网查询了关于ROW_NUMBER()函数的使用,在此期间也发现了与之类似的函数如:

  1. ROW_NUMBER()增添顺序序号,即时存在相同的也递增序号
  2. RANK():相同的数据序号相同,接下来为跳号
(是跳跃排序,有两个第二名时接下来就是第四名)
  • dense_rank():相同的数据序号相同,接下来顺序递增序号(是连续排序,有两个第二名时仍然跟着第三名)
  • ntile(N):将记录分为N组。
  • 它们的使用方法基本相同,只是输出编号方式不同。这里就以ROW_NUMBER()函数为例进行说明,其它使用类似;
    ROW_NUMBER()
    语法:

    ROW_NUMBER ( ) OVER ([ ] )
    返回类型:bigint
    从语法上可见,我们还得了解下over排名开窗函数使用方法,如下所示:
    Over函数不能单独使用,要和分析函数:rank(),dense_rank(),row_number()等以及聚合函数一起使用
    其语法:overpartition by columnname1 order by columnname2

    含义:其中PARTITION BY为分组字段,ORDER BY 指定排序字段

    在新造船软件中,要实现的功能是在分段号和检验项目字段相同的众多历史记录中,获取最新一条记录里的负责人字段,并在用户界面中显示出来,如下图派活管理界面所示:
    ROW_NUMBER分析函数实例
    sql server软件中我们先用以下语句查询:
    select * from [201分段报验记录表] where 分段号='5205' and 检验项目='分段完工'
    获得查询结果如下:

    ROW_NUMBER分析函数实例
    可知,查询结果包括了两条记录,但是我们希望在用户界面中只显示最新一次记录中的负责人姓名,例如:李四;那么,我们使用ROW_NUMBER分析函数就比较方便了,它使得类似问题变得简单;
    这样,我们使用以下包含ROW_NUMBER语句查询:
    SELECT * FROM (SELECT *,num=ROW_NUMBER() OVER(PARTITION BY 分段号,检验项目 ORDER BY 计划结束日期 desc ) FROM [201分段报验记录表] WHERE HullNo='OC400K' ) a WHERE 分段号='5205' and 检验项目='分段完工' AND num=1
    查询结果
    ROW_NUMBER分析函数实例
    可见功能已经实现;
    总结:
    当我们想在分区记录中获取满足条件的记录,可以思考能否使用分析函数结合OVER函数来实现;


我的更多文章

下载客户端阅读体验更佳

APP专享