您现在的位置:首页>审计之窗>审计论坛
开窗函数在民生资金大数据审计和预算执行全覆盖审计中的妙用
信息来源:松滋市审计局 | 发布时间:2019-09-11

 

审计分析中经常使用的SQLServer、Oracle等主流数据库中都提供了对窗口函数over()的支持,窗口函数的优势在于其对一组值进行操作时,无需借助GROUP BY子句对数据进行分组,就能够在同一行中同时返回基础行的列和聚合列。笔者有幸参加了省民生资金大数据审计分析团队,本文就具体谈一谈开窗函数在民生资金大数据审计和预算执行全覆盖审计中的使用。

窗口函数常与排名函数ROW_NUMBER、DENSE_RANK、RANK、NTILE和聚合函数SUMAVGMAXMIN等配合使用形成排名开窗函数和聚合开窗函数。民生资金大数据审计项目共涉及13类资金49张表,分析生成的疑点表需要将明细记录数据和疑点涉及人数、疑点涉及记录数等汇总数据一并展示,以便审计人员现场核实。如在医疗救助资金审计分析中巧用排名和聚合开窗函数为医疗救助明细表追加疑点涉及人数、疑点涉及记录数两个聚合列,摘录代码如下:

WITH CTE AS (SELECT *, DENSE_RANK() over(partition by [所属地区代码] order by [身份号码]) as 人员序号,ROW_NUMBER() over(partition by [所属地区代码] order by [身份号码]) as 记录序号 FROM [民生资金大数据审计标准库].[dbo].[医疗救助明细表]  )

  SELECT *, MAX(人员序号)  over(partition by [所属地区代码]) 疑点涉及人数, MAX(记录序号)  over(partition by [所属地区代码]) 疑点涉及记录数  FROM CTE

在市本级预算执行全覆盖审计中,为了审查上级专项转移支付资金使用效率,需要在支付明细表中找出每一个项目的最后一笔支付明细记录,常规做法是先找到每个项目的最后一笔支付时间,然后再找出每个组里支付时间等于这个值的记录,这种做法缺点是最少要进行一次join,而用开窗函数则很容易实现,摘录代码如下:

WITH CTE AS  (SELECT * , ROW_NUMBER() over(partition by [项目名称] order by [支付时间] desc) as 支付顺序号 FROM [市本级预算执行全覆盖审计].[dbo].[支付明细表]  )

  SELECT * FROM CTE where 支付顺序号=1

在上述两个审计项目中,巧用开窗函数让复杂分析“化繁为简”,极大简化了分析过程,缩减了分析时间,达到了事半功倍的效果。

结语:随着审计项目分析模型越来越复杂,数据分析也相应越来越复杂,很多分析都要通过复杂的相关子查询或者存储过程来完成。从某种程度上说大数据审计的效率决定了整个审计项目的效率和质量开窗函数在审计中的运用正好契合了这一目标的实现。(龚许)


打印|关闭