package com.alimama.quanjingmonitor.kmeans; import java.util.HashMap; import java.util.HashSet; public class PrintSql { /** * 子落 (2014-04-15 10:38:37): 就是强制 指标必须在一定范围内 才能分到一起的那个 张壮 (2014-04-15 10:48:54): 维度:主营类目、B|C、星级 指标:笔单价、财务消耗 子落 (2014-04-15 10:49:41): 就这几个啊 张壮 (2014-04-15 10:49:46): 时间周期:2014-4-2~2014-4-15 张壮 (2014-04-15 10:51:03): 样本量 1000-15000 1000-1500 * @param args */ public static void main(String[] args) { String[] colls_important={"main_cat_name"}; String[] number_important={"(avg(case when (alipay_direct_num+alipay_indirect_num)=0 then 0.00001 else ((alipay_direct_amt+alipay_indirect_amt)/(alipay_direct_num+alipay_indirect_num)) end))"}; String[] colls={"bc_sellers","seller_star_name"}; String[] numbers={"finprice"}; String[] thedates={"20140415","20140402","20140403","20140404","20140405","20140406","20140407","20140408","20140409","20140410","20140412","20140412","20140414"};// makeSql("cust_table", "1=1", "custid", thedates, colls_important, number_important, colls, numbers); // System.out.println(ajustName("c(ust_1d@#$64fd")); } public static String ajustName(String cols) { String rtn=cols.replaceAll("[^A-Za-z0-9_]*", ""); if(rtn.length()>20) { return rtn.substring(0, 20); } return rtn; } public static String[] makeSql(String tablename,String sqlwhere,String idcols,String[] thedates_a,String[] colls_important,String[] number_important,String[] colls,String[] numbers) { String[] thedates=thedates_a; if(thedates.length==1) { thedates=new String[]{thedates_a[0],thedates_a[0]}; } if(sqlwhere.trim().isEmpty()) { sqlwhere="1=1"; } sqlwhere=sqlwhere.replaceAll("^[ |\t]+where", " "); HashMap<String, String> alias_name =new HashMap<String, String>(); HashSet<String> groupbyrepeat=new HashSet<String>(); int index=0; StringBuffer sqlselectbuff=new StringBuffer(); StringBuffer groupBybuf=new StringBuffer(); StringBuffer sqlBaseFilterbuff=new StringBuffer(); alias_name.put(idcols, "k_"+ajustName(idcols)+"_"+index++); sqlselectbuff.append(" ").append(idcols).append(" as ").append(alias_name.get(idcols)); groupBybuf.append(" ").append(idcols); sqlBaseFilterbuff.append(""+idcols+"<>'' and "+idcols+" is not null"); for(String s:colls_important) { if(s.equals(idcols)) { continue; } alias_name.put(s, "hs_"+ajustName(s)+"_"+index++); sqlselectbuff.append(" ,").append(s).append(" as ").append(alias_name.get(s)); if(!groupbyrepeat.contains(s)) { groupbyrepeat.add(s); groupBybuf.append(",").append(s); } sqlBaseFilterbuff.append(" and "+s+" is not null"); } for(String s:number_important) { alias_name.put(s, "hn_"+ajustName(s)+"_"+index++); boolean isaddavg=true; if(s.trim().toLowerCase().startsWith("sum")||s.trim().toLowerCase().startsWith("max")||s.trim().toLowerCase().startsWith("min")||s.trim().toLowerCase().startsWith("avg")||s.trim().toLowerCase().startsWith("average")||s.trim().toLowerCase().startsWith("skip")) { isaddavg=false; } if(isaddavg) { sqlselectbuff.append(" ,").append("avg("+s+")").append(" as ").append(alias_name.get(s)); }else{ sqlselectbuff.append(" ,").append(s.replaceAll("average\\(", "avg(").replaceAll("skip\\(", "(")).append(" as ").append(alias_name.get(s)); } } for(String s:colls) { if(s.equals(idcols)) { continue; } alias_name.put(s, "ls_"+ajustName(s)+"_"+index++); sqlselectbuff.append(" ,").append(s).append(" as ").append(alias_name.get(s)); if(!groupbyrepeat.contains(s)) { groupbyrepeat.add(s); groupBybuf.append(",").append(s); } sqlBaseFilterbuff.append(" and "+s+" is not null"); } for(String s:numbers) { alias_name.put(s, "ln_"+ajustName(s)+"_"+index++); boolean isaddavg=true; if(s.trim().toLowerCase().startsWith("sum")||s.trim().toLowerCase().startsWith("max")||s.trim().toLowerCase().startsWith("min")||s.trim().toLowerCase().startsWith("avg")||s.trim().toLowerCase().startsWith("average")||s.trim().toLowerCase().startsWith("skip")) { isaddavg=false; } if(isaddavg) { sqlselectbuff.append(" ,").append("avg("+s+")").append(" as ").append(alias_name.get(s)); }else{ sqlselectbuff.append(" ,").append(s.replaceAll("average\\(", "avg(").replaceAll("skip\\(", "(")).append(" as ").append(alias_name.get(s)); } } String sqlselect=sqlselectbuff.toString(); String groupBy=groupBybuf.toString(); String sqlBaseFilter="("+sqlBaseFilterbuff.toString()+") "; StringBuffer buff=new StringBuffer(); index=0; buff.append("select tbl_0."+alias_name.get(idcols)+" as col_"+index+" "); index++; StringBuffer[] bufferIndex={new StringBuffer(),new StringBuffer(),new StringBuffer(),new StringBuffer()}; for(int i=0;i<1;i++) { for(String s:colls_important) { if(s.equals(idcols)) { continue; } buff.append(",tbl_"+i+"."+alias_name.get(s)+" as col_"+index); bufferIndex[0].append(index).append(","); index++; } } for(int i=0;i<1;i++) { for(String s:number_important) { buff.append(",tbl_"+i+"."+alias_name.get(s)+" as col_"+index); bufferIndex[1].append(index).append(","); index++; } } for(int i=0;i<1;i++) { for(String s:colls) { if(s.equals(idcols)) { continue; } buff.append(",tbl_"+i+"."+alias_name.get(s)+" as col_"+index); bufferIndex[2].append(index).append(","); index++; } } for(int i=1;i<thedates.length;i++) { for(String s:number_important) { buff.append(",tbl_"+i+"."+alias_name.get(s)+" as col_"+index); bufferIndex[3].append(index).append(","); index++; } } for(int i=0;i<thedates.length;i++) { for(String s:numbers) { buff.append(",tbl_"+i+"."+alias_name.get(s)+" as col_"+index); bufferIndex[3].append(index).append(","); index++; } } buff.append(" from (select "+sqlselect+" from "+tablename+" where dt='"+thedates[0]+"' and "+sqlBaseFilter+" and ("+sqlwhere+") group by "+groupBy+") tbl_0 "); for(int i=1;i<thedates.length;i++) { buff.append(" left outer join (select "+sqlselect+" from "+tablename+" where dt='"+thedates[i]+"' and "+sqlBaseFilter+" and ("+sqlwhere+") group by "+groupBy+") tbl_"+i+" on (tbl_"+i+"."+alias_name.get(idcols)+"=tbl_0."+alias_name.get(idcols)+")"); } System.out.println(buff.toString()); StringBuffer kmeansarams=new StringBuffer(); kmeansarams.append(bufferIndex[0].toString().replaceAll(",$", "")).append(";"); kmeansarams.append(bufferIndex[1].toString().replaceAll(",$", "")).append(";"); kmeansarams.append(bufferIndex[2].toString().replaceAll(",$", "")).append(";"); kmeansarams.append(bufferIndex[3].toString().replaceAll(",$", "")); System.out.println(kmeansarams.toString()); return new String[]{buff.toString(),kmeansarams.toString()}; } }