对数据表的特定字段进行跨行比对分析在审计工作中有着广泛的使用场景,特别是在校验数据完整性时,通过跨行比对分析可高效地检索出数据表中每条记录的编号有无“断号”或重复等异常情况,据此审计人员可初步判断数据是否有被篡改。
LAG函数是一个SQL窗口函数,它提供了访问当前行记录的前一行(或前N行)记录的功能,这是进行跨行数据分析的基础。LAG函数有3个参数:column、offset、default,其中column指定要获取的列,offset为向前偏移的行数,default为超出范围时的默认值。LAG函数须与OVER子句搭配使用,用以确定排序字段和是否分组,OVER语句格式为:OVER(PARTITION BY 分组字段 ORDER BY 排序字段)。
例如,在审查“非税收入应征缴而未征缴”问题时,审计人员使用LAG函数检测非税征缴记录中“断号”的非税票据编号作为核查疑点。本例在SQL实现层面,可分解为两大步骤:一是利用LAG函数将上一行非税票据编号与当前行非税票据编号归并至中间表的同一行;二是校验二者差值是否为1。SQL代码如下所示。
with X1 as(
select TAX_PAYMENT_NUM,
LAG(TAX_PAYMENT_NUM) OVER (order by TAX_PAYMENT_NUM asc)
as PRE_TAX_PAYMENT_NUM from 非税征缴记录表)
select PRE_TAX_PAYMENT_NUM,TAX_PAYMENT_NUM
from X1
where TAX_PAYMENT_NUM - PRE_TAX_PAYMENT_NUM>1
order by TAX_PAYMENT_NUM asc

图一:使用LAG函数筛查非税征缴记录表中不连续的非税票据编号
其中,TAX_PAYMENT_NUM为当前行非税票据编号,PRE_TAX_PAYMENT_NUM为上一行非税票据编号,X1为with子句生成的临时表。由于是在全量范围内筛查不连续的非税票据编号,所以未使用字段作分组。下面再通过一个实例来展示分组使用场景:针对“消费记录被篡改”问题的核查,按用户编号分组后,再采用LAG函数检测消费记录的时序合理性,即消费记录编号的递增顺序是否与消费时间的先后顺序一致,SQL语句如下所示。
with x1 as(
select person_id,expense_num,expense_time
,LAG(expense_num,1) over (partition by person_id order by expense_num)as pre_expense_num
,LAG(expense_time,1) over (partition by person_id order by expense_num)as pre_expense_time
from 消费记录表)
select * from x1
where expense_time<pre_expense_time

图二:通过LAG函数检测消费记录编号顺序与消费时间先后的一致性
上述SQL语句中:person_id为用户编号,expense_time为消费时间,expense_num为消费记录编号。当查询结果显示消费记录编号顺序与消费时间先后不一致时,审计人员即可快速核查相关记录有无被篡改。以上两个实例仅初步展示了LAG函数的基础用法,作为一种功能强大的数据分析工具,其在审计领域更多的应用场景还有待进一步探索。(杨宁夫)
对数据表的特定字段进行跨行比对分析在审计工作中有着广泛的使用场景,特别是在校验数据完整性时,通过跨行比对分析可高效地检索出数据表中每条记录的编号有无“断号”或重复等异常情况,据此审计人员可初步判断数据是否有被篡改。
LAG函数是一个SQL窗口函数,它提供了访问当前行记录的前一行(或前N行)记录的功能,这是进行跨行数据分析的基础。LAG函数有3个参数:column、offset、default,其中column指定要获取的列,offset为向前偏移的行数,default为超出范围时的默认值。LAG函数须与OVER子句搭配使用,用以确定排序字段和是否分组,OVER语句格式为:OVER(PARTITION BY 分组字段 ORDER BY 排序字段)。
例如,在审查“非税收入应征缴而未征缴”问题时,审计人员使用LAG函数检测非税征缴记录中“断号”的非税票据编号作为核查疑点。本例在SQL实现层面,可分解为两大步骤:一是利用LAG函数将上一行非税票据编号与当前行非税票据编号归并至中间表的同一行;二是校验二者差值是否为1。SQL代码如下所示。
with X1 as(
select TAX_PAYMENT_NUM,
LAG(TAX_PAYMENT_NUM) OVER (order by TAX_PAYMENT_NUM asc)
as PRE_TAX_PAYMENT_NUM from 非税征缴记录表)
select PRE_TAX_PAYMENT_NUM,TAX_PAYMENT_NUM
from X1
where TAX_PAYMENT_NUM - PRE_TAX_PAYMENT_NUM>1
order by TAX_PAYMENT_NUM asc

图一:使用LAG函数筛查非税征缴记录表中不连续的非税票据编号
其中,TAX_PAYMENT_NUM为当前行非税票据编号,PRE_TAX_PAYMENT_NUM为上一行非税票据编号,X1为with子句生成的临时表。由于是在全量范围内筛查不连续的非税票据编号,所以未使用字段作分组。下面再通过一个实例来展示分组使用场景:针对“消费记录被篡改”问题的核查,按用户编号分组后,再采用LAG函数检测消费记录的时序合理性,即消费记录编号的递增顺序是否与消费时间的先后顺序一致,SQL语句如下所示。
with x1 as(
select person_id,expense_num,expense_time
,LAG(expense_num,1) over (partition by person_id order by expense_num)as pre_expense_num
,LAG(expense_time,1) over (partition by person_id order by expense_num)as pre_expense_time
from 消费记录表)
select * from x1
where expense_time<pre_expense_time

图二:通过LAG函数检测消费记录编号顺序与消费时间先后的一致性
上述SQL语句中:person_id为用户编号,expense_time为消费时间,expense_num为消费记录编号。当查询结果显示消费记录编号顺序与消费时间先后不一致时,审计人员即可快速核查相关记录有无被篡改。以上两个实例仅初步展示了LAG函数的基础用法,作为一种功能强大的数据分析工具,其在审计领域更多的应用场景还有待进一步探索。(杨宁夫)
鄂公安网安备42010202000841号