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

前言

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

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

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

动态报表强化了这个方式

详见链接

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

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

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

ed0cc35325dc570cd94cd3e87c942a37.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 则会给出不同的排名 ,需要根据具体的应用场景判断使用哪一个函数

4b8801abc12444b39c89c3f09189fe67.png

3451505654280ed62eb774c02477f116.png

0dbf4e8692b81dcd6bde657be22a9a64.png

应用实例一

获取有效的采购信息记录

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

  • 商品+供应商  表EINA

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

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

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

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

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

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

3160951648e4473fea5d7c3a5871c71a.png

5ae861bbd03e58d57815a7a44d3c4007.png

SQL过程

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

ff34c9babef9fd1d814bd4efc8b6eab9.png

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

9ad56d51343c0592c32e02db59541882.png

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

6007ffe2e81131cc62535a5d2adbfe8d.png

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

b4433f6f0371e25513776adfa517af02.png

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

d78a62573db8aa267ec70d630c9c257e.png

如下图所示,

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

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

2be43da45b3eb273a35b0f402b1b8a5d.png

应用实例二

价格解析.

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

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

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

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

8b4b12bcdd1c83fd657a680f028b45d6.png

1184e9e7cfb1975b17d1a795e670a291.png

ee5b308e0bd0b3193cc6ebefe1343b80.png

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

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

907e56443e061af31af379a6c1e7d428.png

26caa856002f63a582f897c44e5c273d.png

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

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

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

895fab11626e7c992ec87f37a6ebcba3.png

ae3f2cd61414761dce4ee6c61b7a6f5d.png

dfc27480cc38b2a0a669597c7d94f7c0.png

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

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

5a74ee344817ba51cb32a3ad917c6a91.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

fab6bea3feb73b4f33d2151d730a74e9.png

THE

END

约定

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

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

请微信联系管理员: 

syjf1976 

sharry_xlp  

Yannick_Duan 

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值