atitit. 集合groupby 的实现(2)---自己定义linq查询--java .net php

atitit.  集合groupby 的实现(2)---自己定义linq查询--java .net php 

 

实现方式有例如以下

 

1. Linq的实现原理流程(ati总结) 1

2. groupby  与 事先排序 2

3. #----------聚合函数 2

4. 自己定义linq查询Linq .from(li) .groupBy("url","user" ) .select("url", count().as("countx"), avg("len").as("avgx")); avg("len").as("avgx")); 3

5. Groupby分组方法 code----groupBy() 4

6. 实现聚合操作select() 5

7. Count,sum()的实现 7

8. 參考 7

 

 

 

做报表统计啊。有个大问题。。

有人整过集合的groupby查询汇总(Sum)没有哟??已经使用了linq4jquaere,josql。,ms Map字典不起作用。

 

1. Linq的实现原理流程(ati总结)

全部的统计函数都是对查询出的每一行数据进行分类以后再进行统计计算。所以在结果集合中,对所进行分类的列的每一种数据都有一行统计结果值与之相应。

聚合结果是针对每个分组,而不是整个表

从技术上来说,能够使用不带不论什么聚合函数的GROUP BY子句,但这种语句可能毫无意义。

要将全部行分组, 必需要对全部的行运行操作,

Process pic as flow..(PDA pic)

 

 

grpBy()

Union>>>grpTAb1>>> sum() .leftjoin( count()) .leftjoin (avg());

Union>>>grpTAb22  >>sum() .leftjoin( count()) .leftjoin (avg());

Filter Outpu();

作者::老哇的爪子Attilax艾龙。EMAIL:1466519819@qq.com

转载请注明来源:http://blog.csdn.net/attilax

 

2.  groupby  与 事先排序

一些程序的groupby  操作 api须要数据事先排序..而实际上,这个不是必须的..

 

Excel的groupby就要事先排序的

 

 

 

3. #----------聚合函数

聚合函数分为两类,,,,单行函数和多行函数。多行函数也叫聚合函数、组合函数。
 。聚合函数的參数为数组

在java8 JDK包括很多聚合操作(如平均值。总和,最小,最大。和计数),返回一个计算流stream的聚合结果。这些聚合操作被称为聚合操作。

JDK除返回单个 值的聚合操作外。还有非常多聚合操作返回一个collection集合实例。非常多的reduce操作运行特定的任务,如求平均值或按类别分组元素。

#-----------通用的聚合操作:Stream.reduce,Stream.collection

JDK提供的通用的聚合操作:Stream.reduce,Stream.collection

注意:本文将reduction operations翻译为聚合操作,由于reduction operations通经常使用于汇聚统计。

两者的差别:

Stream.reduce,经常使用的方法有average, sum, min, max, and count。返回单个的结果值。而且reduce操作每处理一个元素总是创建一个新值

Stream.collection与stream.reduce方法不同。Stream.collect改动现存的值,而不是每处理一个元素,创建一个新值

 

 

#--------特定用途的汇聚操作

Stream接口有一些通用的汇聚操作,比方reduce()和collect();也有一些特定用途的汇聚操作,比方sum(),max()和count()

 

 

4. 自己定义linq查询Linq .from(li) .groupBy("url","user" ) .select("url", count().as("countx"), avg("len").as("avgx")); avg("len").as("avgx"));

public static void main(String[] args) { // throws QueryParseException,

// QueryExecutionException {

// attilax 老哇的爪子 0_52_g o8d

List li = new ArrayList<Map>() {

{

this.add(new HashMap() {

{

put("url", "url1");

put("user", "u1");

put("len", 1);

}

 

});

this.add(new HashMap() {

{

put("url", "url1");

put("len", 9);

put("user", "u2");

}

 

});

this.add(new HashMap() {

{

put("url", "url2");

put("len", 5);

put("user", "u1");

}

 

});

}

};

 

List li2 = Linq

.from(li)

.groupBy("url","user" )

.select("url",  count().as("countx"),

avg("len").as("avgx"));

core.print_wzFmt(li2);

 

结果:::

 

[

    {

    "avgx": null,

    "countx": 1,

    "url": "url1"

  },

    {

    "avgx": null,

    "countx": 1,

    "url": "url1"

  },

    {

    "avgx": null,

    "countx": 1,

    "url": "url2"

  }

]

 

 

5. Groupby分组方法 code----groupBy()

public Linq groupBy(final String... fld) {

// attilax 老哇的爪子 l_39_39 o8d

this.grpby_flds = fld;

CollectionUtils.each(this.li, new Closure<Map, Object>() {

 

@Override

public Object execute(Map m) throws Exception {

// attilax 老哇的爪子 m_4_41 o8d

 

Val v = Mapx.$(m).get(fld);

 

// if(createGrp(m.get(fld)))

String key = v.toString();

if (grpbyRztLi_MpFmt.get(key) == null)

grpbyRztLi_MpFmt.put(key, new GroupTable());

GroupTable gt = grpbyRztLi_MpFmt.get(key);

gt.grpby_fld = fld;

gt.key = v;

gt.add(m);

 

return null;

 

}

 

});

return this;

 

}

 

6. 实现聚合操作select()

public List select(final Object... slktObj) {

// attilax 老哇的爪子 l_46_a o8d

// list union

List lix = CollectionUtils.each_RE(grpbyRztLi_MpFmt,

new Closure<Entry<Object, GroupTable>, Object>() {

 

@Override

public Object execute(Entry<Object, GroupTable> e)

throws Exception {

// attilax 老哇的爪子 0_e_47 o8e

List<Map> singTab = e.getValue().li;

List<reduceCalcRzt_singleExprs> li = new ArrayList<>();

for (Object o : slktObj) {

if (o instanceof Iredus) {

Iredus ci = (Iredus) o;

 

reduceCalcRzt_singleExprs rzt_se = ci

.exec(singTab);

li.add(rzt_se);

filtOutputFlds.add(ci.getOutputColname());

} else {

filtOutputFlds.add(o.toString());

}

}

reduceCalcRecord rcr = redusUtil.leftjoin(li);

rcr.map.putAll(singTab.get(0));

return rcr.map;

 

}

});

//filt  fld to output 

List li2 = CollectionUtils.each_NS(lix, new Closure<Map, Map>() {

 

@Override

public Map execute(Map arg0) throws Exception {

// attilax 老哇的爪子 12:29:50 AM Aug 17, 2014

 

final Map m = new HashMap();

CollectionUtils.each_RE(arg0, new Closure<Entry, Object>() {

 

@Override

public Object execute(Entry e) throws Exception {

// attilax 老哇的爪子 12:33:21 AM Aug 17, 2014

 

String k = e.getKey().toString();

if (filtOutputFlds.contains(k))

m.put(k, e.getValue());

return null;

 

}

 

});

return m;

 

}

});

return li2;

 

 

}

 

7. Count,sum()的实现

public class countImp 

@Override

public reduceCalcRzt_singleExprs exec(final List GroupTable ) {

// attilax 老哇的爪子  10:16:21 PM   Aug 16, 2014 

reduceCalcRzt_singleExprs o=new reduceCalcRzt_singleExprs();

o.map=new HashMap(){

{

put(colName,GroupTable.size());

}

};

{ 

return o;

 } 

}

8. 參考

 

Java8怎样进行stream,reduce,collection操作 - 51CTO.COM.htm

Java并没没落:最新Java 8简明教程译文(3) - 51CTO.COM.htm

 

我要啦免费统计
posted @ 2017-05-27 09:28  wzjhoutai  阅读(379)  评论(0编辑  收藏  举报