今朝的题目是一个隐藏的宝藏话题,Saved Search中我们极少用的一个功能--When Ordered By Field和Keep Dense_Rank。
假如你碰到一个需求,要求是:“在销售历史中按照客户别,取最早交易日期的销售金额,以识别VIP客户”。这是一个朴素的需求吧?你的直觉是一个Saved Search。
不要往下看,你想想该怎么做?
。
。。
。。。
。。。。
。。。。。
。。。。。。
关键之处就在这里,When Order By Field。这个参数的作用是“按照某个字段进行排序”,然后取另外一个字段(Field)的最大或最小值(Summary Type)。
结合上面的需求,这几个参数这样用:
上面的含义是:Group By Customer,Minimum Amount When Ordered By Minimum Date
就是:按照客户分类,将最早的日期的交易金额列示出来。
这看起来是不错的,对吧?但是~~,如果最早的日期中,有多笔交易,金额不同,但是我们想取金额大的那个。怎么办?上面的功能只支持我们取“金额低“的记录,不支持“金额高”的。因为,Summary Type只有一个,要么时间和金额都取Max的,要么都取Min的。没有可能时间取远(Min)的,金额取大(Max)的。
要解决这个同一日期有多个金额的场景需求,需要引入另一个主题“Keep Dense_Rank”。这是个Oracle的分析函数。其功能用于补足上述的缺陷。
看上面的解释,大家基本懵圈,请参考下面的系统实例:
max ( {grossamount})keep(dense_rank first order by {trandate})
这个公式的意思是:用Keep函数取First Transaction Date的日期,然后在那个日期里,取Max的交易金额。请注意,公式提供了First日期和Max金额组合,从而解决在一个日期里多笔交易,多个金额的问题。
下图是上面两种方法在取数上的差别。请观察一下两者的差异。
希望本文能够启发我们的思考,NetSuite的功能还有多少你不知道,有多少隐藏的功能宝藏等你来发掘。
如果有任何关于NetSuite的问题,欢迎来谈。我的邮箱:rick.mao@truston.group