复杂的HANASQL RANK和ROW_NUMBER函数的应用

前言

基于HANA的内存数据库的强大性能, SAP建议把业务逻辑下沉到HANA中计算.以便减去应用服务器的负担,让程序性能更好一些.

SAP本身的一些复杂的业务逻辑比如MRP运算(MD01)也有了新的事务 MD01N (MRP LIVE)

报表类的数据分析程序尤其适用. 

动态报表强化了这个方式

详见链接

无峰,公众号:ABAP 技巧与实战动态报表D-Query简介

复杂的HANASQL系列,主要介绍在项目中一些复杂业务逻辑的SQL实现

本文主要介绍怎么使用RANK 和ROW_NUMBER 函数实现某些特定的业务查询

276fcaaf63e4a04aba43d14699311478.png

RANK

语法

RANK() OVER (PARTITION BY ORDER BY ASC/DESC)

1、此函数根据分组和排序子句计算数据集的排名。

2、当我们必须从源集中的多人记录或前N个或后N个记录中选择最新记录时,这将非常有用

ROW_NUMBER

语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN ASC/DESC )

row_number() OVER() 从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER (ORDER BY c1 DESC) 是先把c1列降序,再为降序以后的没条c1记录返回一个序号。

row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)

比较

RANK VS ROW_NUMBER

通过如下数据及SQL语句中rank 和 row_number的结果呈现, 可以看出

二者都是给分组的数据按指定顺序给出排名, 只是RANK 在分组字段和排序字段内容一致时,给出相同的排名. 而 ROW_NUMBER 则会给出不同的排名 ,需要根据具体的应用场景判断使用哪一个函数

fa961cd2c771218e6d10e3328c60f683.png

636084616d771e8dcc672db7e10dc4f1.png

5a42d2d9da0d0b64aa616c95fb1971ec.png

应用实例一

获取有效的采购信息记录

系统的采购信息记录分别维护在三个层级,如下图所示,

  • 商品+供应商  表EINA

  • 商品+供应商+采购组织  表EINE 地点为空

  • 商品+供应商+采购组织+地点  表EINE 地点非空

当系统创建采购订单读取采购信息记录时, 需要判断商品+供应商+采购组织+地点是否存在采购信息记录,此时系统标准逻辑会判断采购信息记录的后两个层级

  • 如果有商品+供应商+采购组织+地点的记录,则采用该记录

  • 如果没有,则采用商品+供应商+采购组织+地点为空的记录

如果我们希望通过一个查询获取商品+供应商+采购组织+地点是否存在采购信息记录,并且标记该采购信息记录的来源,则可以使用RANK(因为这里不会出现重复的数据,使用RANK和ROW_NUMBER没有区别)

c080bdaad82cd3220d96009d8c0cec95.png

bd10cf2107f408952f0bdcd27f635e47.png

SQL过程

先把地点为空的记录扩展到所有地点(扩展时需要排除那些无用的工厂),零售行业可以按T001W-EKORG = EINE-EKORG 扩展到采购组织相关的地点(工厂). 非零售行业没有强调采购组织和工厂的关系,需要全部扩展,给出一个数据源 ZSOURCE = ‘1’

e3574d166a49cf0c0a39f02d03538d3d.png

把地点为空和非空的组合到一起

537e6f37f930afb9b962f13c00352f2a.png

对组合后的表,使用rank 按 MATNR,LIFNR,EKORG,WERKS 分组, 按ZSOURCE 倒排序(基于之前给每个源设置的值,确定使用正排序,还是倒排序),给出排名

97e9b2547ebdd9eebd767899a62bae3d.png

只获取排名为1的记录.这个结果集就是可以固化下来的采购信息记录查询视图.

135975d7364b3f0aa3126cf4d05c8f20.png

我们可以通过限制条件,获取商品+供应商在每个采购组织,地点的采购信息记录信息及来源

577b94c7a8ee0b65b3c65d72f8947157.png

如下图所示,

1598工厂存在EINE记录,来源为2.

5981工厂不存在EINE记录,采用了WERKS=’’的记录.来源为1

978ce4d8a2cf52ed42fd2931f0d40698.png

应用实例二

价格解析.

比如采购价PB00 ,有很多层级, 使用最多的就是下图的两个层级

  • 带有地点的采购信息记录 A017

  • 不带地点的采购信息记录 A018

定价逻辑会根据指定供应商,物料,采购组织,工厂,日期先查询A017,如果没有获取到价格,再指定供应商,物料,采购组织,日期查询A018

bd49ac0a3fbfcec662e1dc40494195d3.png

9d43bb6d20c53d9aecea957e5e7e1ef9.png

7bf5430aa9555371e78ea547491eded8.png

通过视图把采购价逻辑固定的方法与固定采购信息记录的方法类似, 只是这里需要增加一个日期作为查询的输入参数.

通过CDS视图ZVQ_CGJ_DAT .联合A017,与展开到地点的A018数据,

4f03128839a95d95788b89bebf5d8579.png

7784963a440eda51d69292305e1eac20.png

通过CDS TABLE FUNCTION 调用HANA SQL 获取RANK后的数据(CDS视图的SQL语法不支持RANK函数,所以只能实用该方法. 示例中默认获取当前日期的采购价.没有通过视图的参数传递采购价.

该方法的详细步骤详见链接

无峰,公众号:ABAP 技巧与实战ABAP基础知识 怎么访问HANA数据库中的其它CATALOG的表

58f2a57dae301a6d796e2cc8a61ea9e4.png

3715f7ce0e19cf1b5a5b0efccedb9871.png

4c9240c8cb4ec68ad056c63d062ddf2b.png

最后再通过一个CDS视图读取TABLE FUNCTION 的结果.这样对ZVQ_CGJ_S的视图访问可以获取供应商,商品,采购组织,采购信息类型,地点的解析后的定价.

TABLE FUNCTION 可以直接在ABAP程序中使用 ,但不能通过SE16N使用. 再次封装的目的是为了SE16N也能使用该视图

7ba4408d7412940450f4a13758ce3268.png

总结

RANK ROW_NUMBER 属于窗口函数

窗口函数,也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据库数据进行实时分析处理。

窗口函数的语法规则:

<窗口函数> over (partition by <用于分组的列名>

order by <用于排序的列名>)

使用窗口函数可以把一些SAP中存在优先关系业务逻辑呈现并固定在特定的视图中.

本文给出的采购信息记录解析及价格解析就是如此. 通过对固定逻辑的视图访问,可以快速获取采购信息记录相关信息及采购价信息.

在采购信息记录解析中,使用了嵌套的HANA语句. 方便大家理解数据获取的过程. 

在价格解析中,则使用了CDS 及 AMDP 把逻辑通过CDS视图固定. 其它相关程序或视图可以方便的调用该视图获取当前日期的采购价.

最新的ABAP SQL语法中也支持RANK ROW_NUMBER 函数. 详见语法帮助及示例程序 DEMO_SELECT_OVER

1803979f0a9464253f40f5ce2ef4d3db.png

THE

END

约定

如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.       

    (如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程. 越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.)

请微信联系管理员: 

syjf1976 

sharry_xlp  

Yannick_Duan 

申请进入公众号讨论群提问或者参与话题讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值