添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

本文实现了一个按照指定百分位的数据生成等距的序列值,分位数的数据按照每增长一个百分点分一组,如果分组的数据没有值自动会合并到下一组,直到满足条件的分组,上限100组哦.

TODO优化:动态分组,并且不限制分组数量.

思路1 将分组后的数据进行自关联(需要转成行记录),拿到本组以及下一个分组的数值,然后和需要分组的表进行关联

当需要分组的字段落地对应的分组区间的时候(此处采用不等值连接,不知道pgsql是否支持,如果不支持采用where过滤吧)

思路2 使用存储过程或者UDF函数,进行数据的遍历判断数值所在的分组,

思路3 将分组转换成字典或者是Map,将数值映射成整数值(四舍五入)假定为m,然后从分组表中取出字典对应的数值,如果有值则取,否则就看下是取最小分组还是取最大分组. 此方法时间复杂度上是最优的,时间复杂度为O(1).

在判断某个元素是否在某个序列中的时候,dict是O(1),list需要遍历,所以是O(n),这时候尽量不要用list,能够用字典进行存储,尽量不要用list。

注意所有细节部分,需要测试,避免出错.

看得懂的拿走,不谢!

CREATE OR REPLACE FUNCTION cust_fdss_calc_fzld_group_fun_step2(current_view_id varchar,current_col varchar) RETURNS void AS   $BODY$  Declare sqlstring varchar ;   BEGIN    -- 删除历史数据    EXECUTE 'delete from  cust_fdss_calc_fzld_branch_percent where view_id =''' || current_view_id || ''' and branch=''' || current_col || ''';' ;   -- step 4.1.1 计算分位数对应的数值   sqlstring:='insert into cust_fdss_calc_fzld_branch_percent      select       array_agg(ix) as percent -- 将序列值转成数组 ,并计算数值的最大值      ,max(ix) as max_percent      , ' || quote_literal(current_view_id ) || '::varchar as view_id      , ' || quote_literal(current_col )|| '::varchar     as branch     from (           select generate_series(cast(percentile_disc[1]*100 as integer),cast(percentile_disc[2]*100 as integer), 1)/100.0::numeric  as ix  -- 根据数值的最小和最大值生成序列值          from ( SELECT percentile_disc(ARRAY[0.005,0.995]) WITHIN GROUP (ORDER BY ' || quote_ident(current_col ) || ' ) -- 计算分位数对应的数值                FROM cust_fdss_calc_fzld_s2                 where view_id =''' || current_view_id || '''      ) percent      ;'  ;    EXECUTE sqlstring ;   $BODY$  LANGUAGE plpgsql;

=================  完整存储过程 ==================

CREATE OR REPLACE FUNCTION cust_fdss_calc_fzld_group_fun_step2(current_view_id varchar,current_col varchar) RETURNS void AS   $BODY$  Declare sqlstring varchar ;   BEGIN    -- 删除历史数据    EXECUTE 'delete from  cust_fdss_calc_fzld_branch_percent where view_id =''' || current_view_id || ''' and branch=''' || current_col || ''';' ;   -- step 4.1.1 计算分位数对应的数值   sqlstring:='insert into cust_fdss_calc_fzld_branch_percent      select       array_agg(ix) as percent -- 将序列值转成数组 ,并计算数值的最大值      ,max(ix) as max_percent      , ''' || current_view_id || '''::varchar as view_id      , ''' || current_col || '''::varchar     as branch     from (           select generate_series(cast(percentile_disc[1]*100 as integer),cast(percentile_disc[2]*100 as integer), 1)/100::numeric  as ix  -- 根据数值的最小和最大值生成序列值          from ( SELECT percentile_disc(ARRAY[0.005,0.995]) WITHIN GROUP (ORDER BY "' || current_col || '") -- 计算分位数对应的数值                FROM cust_fdss_calc_fzld_s2                 where view_id =''' || current_view_id || '''      ) percent      ;'  ;    EXECUTE sqlstring ;   -- step 4.1.2 对预估赔付率进行分组  -- EXECUTE 'drop table if exists cust_fdss_calc_fzld_branch_group ;' ;  -- EXECUTE 'delete from  cust_fdss_calc_fzld_branch_group  where view_id =''' || current_view_id || ''' ;' ; EXECUTE 'delete from  cust_fdss_calc_fzld_branch_group where view_id =''' || current_view_id || ''' and branch=''' || current_col || ''';' ;   sqlstring:='insert into cust_fdss_calc_fzld_branch_group   select   a.view_id ,policy_id ,coins_premium_ply ,b.branch as branch  -- yugu_pfl ,' || current_col || '  ,case  -- when yugu_pfl < percent [01 ] then percent[01 ] -- 剔除第一分组的人  when  ' || current_col || ' <= percent [02 ] then percent[02 ]    when  ' || current_col || ' <= percent [03 ] then percent[03 ]    when  ' || current_col || ' <= percent [04 ] then percent[04 ]    when  ' || current_col || ' <= percent [05 ] then percent[05 ]    when  ' || current_col || ' <= percent [06 ] then percent[06 ]    when  ' || current_col || ' <= percent [07 ] then percent[07 ]    when  ' || current_col || ' <= percent [08 ] then percent[08 ]    when  ' || current_col || ' <= percent [09 ] then percent[09 ]    when  ' || current_col || ' <= percent [10 ] then percent[10 ]    when  ' || current_col || ' <= percent [11 ] then percent[11 ]    when  ' || current_col || ' <= percent [12 ] then percent[12 ]    when  ' || current_col || ' <= percent [13 ] then percent[13 ]    when  ' || current_col || ' <= percent [14 ] then percent[14 ]    when  ' || current_col || ' <= percent [15 ] then percent[15 ]    else max_percent end as branch_g -- 此处将分组分组加1  from cust_fdss_calc_fzld_s2 a join cust_fdss_calc_fzld_branch_percent b on 1=1 and a.view_id=b.view_id and b.branch=''' || current_col || '''  where a.view_id =''' || current_view_id || '''  -- limit 90   EXECUTE sqlstring ;  -- 4.1.3 预估赔付率 分组统计     EXECUTE 'delete from  cust_fdss_calc_fzld_branch_static where view_id =''' || current_view_id || ''' and branch=''' || current_col || ''';' ;  sqlstring:='insert into cust_fdss_calc_fzld_branch_static              select               view_id              ,branch               ,branch_g              ,row_number() over(order by branch_g ) as rw             ,sum(coins_premium_ply) as coins_premium_ply             ,count(1) as g_cnt              from cust_fdss_calc_fzld_branch_group              where branch_g is not null and view_id=''' || current_view_id || ''' and branch=''' || current_col || '''             group by view_id ,branch ,branch_g              ; ' ;  EXECUTE sqlstring ; $BODY$  LANGUAGE plpgsql;


# 后期采用json形式进行优化后,效率提升50%,记录下

delete from tmp_cust_fdss_calc_fzld_branch_percent  where view_id='4049fa36b4cb4b39a7d2dfa900a95ec2';  insert into  tmp_cust_fdss_calc_fzld_branch_percent   select  concat('{', array_to_string( array_agg(v),',')  ,'}' )::json as percents  , min(ix) as min_branch_value  , max(ix) as max_branch_value ,'yugu_pfl'::varchar as branch  ,'4049fa36b4cb4b39a7d2dfa900a95ec2'::VARCHAR  as view_id from (        SELECT concat('"',cast(round(ix,2)*1 as numeric)::text ,'":',round(ix,2)::text,'') as v ,ix         from(             select generate_series(cast(PERCENTILE_CONT[1]*100 as integer),cast(PERCENTILE_CONT[2]*100 as integer), 1)/100::numeric  as ix  -- 根据数值的最小和最大值生成序列值              from (                  SELECT PERCENTILE_CONT(ARRAY[0.005,0.995]) WITHIN GROUP (ORDER BY yugu_pfl ) -- 计算分位数对应的数值                 FROM cust_fdss_calc                   where view_id = '01e5bc65ac054e8b8c22ef84b84cc237'              ) percent  select  a.view_id ,policy_id ,calc_coins_premium_ply as coins_premium_ply ,b.branch as branch  ,yugu_pfl as branch_value , case  when yugu_pfl <= min_branch_value then min_branch_value::varchar   -- 剔除第一分组的人 when yugu_pfl >= max_branch_value then max_branch_value::varchar  -- 剔除第一分组的人 else percents->>(round(cast(yugu_pfl as numeric) ,2))::varchar end as branch_g                                                  -- percents->>(round(cast(yugu_pfl as numeric) ,2))::varchar  as branch_g                                                  from cust_fdss_calc a  join tmp_cust_fdss_calc_fzld_branch_percent b on 1=1 and a.view_id=b.view_id and b.branch= 'yugu_pfl'  where a.view_id ='4049fa36b4cb4b39a7d2dfa900a95ec2'  -- limit 10 什么是SQL函数?SQL函数包体是一些可执行的SQL语言。同时包含1条以上的查询,但是函数只返回最后一个查询(必须是SELECT)的结果。除非SQL函数声明为返回void,否则最后一条语句必须是SEL... 来自: u010251897 在使用postgres数据库的过程中,遇到了表分区的问题。为了创建表分区,首先得创建分区表。首先想到的是写个存储函数,然后定时的创建分区表,然后再创建触发器去操作分区表。但是在创建存储函数时,怎么把分... 来自: zoboy的博客 一般变量使用我们都是放在函数里面,这里开发需求,要在SQL直接使用变量,方便查找一些问题,比如时间变量,要根据时间进行筛选这里有三种方法可以实现1.psql命令使用变量表数据如下:hank=>sele... declare@F_Moneyvarchar(30)declareCur1_Billcursorforselectb.F_Moneyfrom "Table"open Cur1_Billfetchnex... 来自: guoyong4321的专栏 在项目中为了覆盖测试用例会对数据库某个表中的一个或多个字段进行修改进行一系列的操作,而查询条件的那个字段经常用到如果查询条件的值变了,涉及到的语句就要一个一个进行粘贴,比较麻烦,而我这个人属于很懒的那... 来自: dayuzhuangzhi的博客 我想创建一个函数,用来查询一个表里的数据,但是表名是需要动态变化的 函数大概的方法如下: CREATE OR REPLACE FUNCTION test() RETURNS SETOF record 例:CREATE PROCEDURE get_booksearch(    @key nvarchar(20),        @key1 nvarchar(20))AS    exec(select... 来自: DQW的Blog 今天写一个对数据库做快照的存储过程,用到了动态表名,突然发现MYSQL不支持直接使用变量做表名,GOOGLE了下,采用以下方法:注意:preparestmtfrom后面的变量必须用@标注的用户变量,否... 来自: fangletian1981的专栏 1.事件概述今天再写存储过程使用变量没注意到问题,导致SQL执行缓慢,找了许久才发现哪里有问题。2.发现问题在存储过程中执行下图sql需要20秒左右,执行计划发现走了全表扫描,而在存储过程中相同的SQ... 来自: j_ychen的博客 SELECTZXS.ID,ZXS.XMINTOXSID,XSXM_FROMZZ_ZXS_JBXXLSZXSWHEREZXS.SFZJLX='1'ANDZXS.SFZJH=SFZJH_ANDZXS.ZZ... 来自: 荔子——一路走来 Oracle存储过程表名称列名称做参数,动态SQL背景当前的系统中有几种日志信息做了分表处理,每个月插入到一个表中,一个表的分表有12个。这样的这种表有四个左右。有个定时器,每天晚上的时候去执行满足条... 来自: 汪小哥 1.什么时候用+号?为了组成一个字符串类型的语句,要用+号作连接符。一般情况下,字符串与字符串变量连接时才用加号。如:DECLARE@SQLNVARCHAR(1000),@tablenamenvar... 来自: 哈里小窝 转自:http://blog.csdn.net/u014539401/article/details/52081511具体参考:《PostgreSQL9.4.4中文手册》  环境变量说明PGHOST要... 来自: housonglin1213的博客 CREATE OR REPLACE FUNCTION select_pi(keywords character varying, geo geometry, dis integer) RETURNS 1.需要用到切割字符串函数:regexp_split_to_array函数:regexp_split_to_array(stringtext,patterntext[,flagstext])说明:Sp... 来自: IT_ziliang的博客 请问如何在postgre下声明一个变量 ?我在SQL中定义如下,现在转化成为postgre,总是有问题,不知道如何解决。 declare @A datetime declare @B decimal( PostgreSQL8.1中文文档PrevFastBackwardChapter5.数据定义FastForwardNext5.5.修改表如果你创建了一个表后发现自己犯了一个错误,或者是应用的需求发生了... 来自: 一名普通码农的菜地 刚开始的存储过程:createPROCEDURE[dbo].[mytest]( @myTable varchar(100))AS select*from@myTable运行时,显示错误:消息1087,... 来自: libbo2000的专栏 1.更改表名 altertable表名renameto新表名2.更改字段名altertable表名rename字段名to新字段名3,更改字段类型如:ID字段原类型为charactervarying(5... 来自: sq8706的专栏 MySQL在存储过程中是不支持直接使用变量名作为表名或者是列名的,而在实际的应用中确实会用到变表名或者变量名的情况,如数据量很大的时候就会用到分表。通过在网上查了mysql5.1以上的版本提供了pre... 来自: づ開始懂了的博客 动态语句基本语法:1:普通SQL语句可以用exec执行Select*fromtableNameexec('select*fromtableName')execsp_executesqlN'select... 来自: jane007123的专栏 --Function:sp_feesauditrecord_insert(charactervarying,charactervarying,integer,charactervarying,nume... 来自: poxiaohai2011的专栏 参考自:https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html中的4.1.2.4.Dollar-quotedStr... 来自: msdnchina的专栏@JiNan,ShanDong 转自:https://blog.csdn.net/crazyminghao/article/details/76565769数据表结构三张表:学生表、课程表、成绩表CREATETABLE`studen... 来自: beidaol的专栏 使用python操作mysql数据库的时候,被一个问题困扰了好久,原因是数据库里面有个表按日期分的。也就是每天一个新表,数据在入库的时候,表名在python程序里面是一个变量,同时表里面字段有很多,本... 我们知道,在MySQL的储存过程中,一般的输入参数为各种数据类型,如数值型,字符型等。那么,能不能让输入参数等于表名呢?答案是肯定的,那就是使用MySQL提供的PREPARE语法。  关于PREP... 来自: 但盼风雨来 原文:http://luoyu-ds.iteye.com/blog/1517607 要实现动态传入表名、列名,需要做如下修改 添加属性statementType=”STATEMENT”(可省略) 同时... 来自: 小葫芦的博客 用存储过程Sp_rename修改表名称列名sqlserver2009-02-2510:39:28阅读80评论0  字号:大中小 订阅Sp_rename存储过程可以修改当前数据库中用户对象的名称,如表、... 来自: jelly1102的专栏 1 :普通SQL语句可以用Exec执行eg:   Select * from tableName         Exec('select*fromtableName')         Exec s... 来自: wozengcong的专栏 需求:用存储过程查询动态表名的数据遇到问题:查询语句from后面不能直接用参数查询 MYSQL不支持直接使用变量做表名,会把参数名当做表名查询,报错解决方法:把查询语句和变量通过concat连接付给变... 来自: Alice_qixin的博客 今天写存储过程时,遇到要将表名最为参数的问题,如果不涉及到游标的话,使用prepare可以解决问题,但是,动态表名要运用在游标中的话,则prepare就得靠边站了。集众人之智慧,最后,使用临时表解决了... 来自: wuwei19871020的专栏 pgscreateorreplacefunctionselect_resource_produrce(INmprCodetext,INpublicationTypetext,OUTresourceNa... 来自: 用技术完善青春年华 存储过程:DROPPROCEDUREIFEXISTS`pagePro`;CREATEDEFINER=`root`@`localhost`PROCEDURE`pagePro`(inpageNoint,i... 来自: lxpaopao的专栏 表格名称中包含特殊字符、字段名称中如果有特殊字符,在创建表格的时候加入双引号包裹字段名称即可成功创建例如:CREATETABLE"Table1-Test"("Id-/P"int,LastNamevar... 来自: lifuzl1的专栏 最近学了下数据库,为了练习下T-SQL,也是为了管理班级的需要,有所有课程学生绩点(S#,姓名,课程名。。。)与学生每门课程绩点(S#,课程,绩点)两个表,我先将数据统计于表一中,由于有时从第一个表... 来自: black_szy的博客 postgresql修改主键UUIDALTERTABLEPUBLIC.DEMO.TESTALTERCOLUMNIDSETDEFAULTUUID_GENERATE_V1();oracle库中:ALTER... 来自: 疯狂编程路上的藏羚羊 关键字:mysql存储过程1.用变量做表名: 简单的用set或者declare语句定义变量,然后直接作为sql的表名是不行的,mysql会把变量名当作表名。在其他的sql数据库中也是如此,mssql的... 来自: superbfly的专栏 staticStringurl=&quot;jdbc:mysql://localhost:3306/test?characterEncoding=utf8&amp;amp;useSSL=true&qu... 来自: qq_20936333的博客 在mysql存储过程中,声明一个变量可以使用declarevi_num(变量名)int(数据类型)的方式。还可以直接使用@变量名的方式,直接使用一个变量。请看以下存储过程: dropPROCEDURE... 来自: u011505792的博客 前提是已经创建连接了frompsycopg2.extensionsimportAsIscur=conn.cursor()schame='schemaname'table='tablename'cur.... 来自: RobbenEmi的专栏 在Oracle的存储过程中表字段名和变量不能一样,否则无效,如在selectcount(0)intocCountfrom dt_userpayinfotwhere t.billid=Billidand... 来自: hahahajingzi的博客 发帖求助,oracle函数中,把一个表名当作一个参数输进来的时候,那个动态组合的sql语句在转义的时候,出了问题。我把这个问题贴出来,请高手指教!函数的源代码:CREATEORREPLACEFUNCT... 来自: iteye_3050的博客 获取表名及注释:selectrelnameastabname,cast(obj_description(relfilenode,'pg_class')asvarchar)ascommentfrompg... 来自: cicon的博客 只狼影逝二度是由FROM SOFTWARE精心研发,方块游戏代理的一款第三人称动作冒险3A单机大作,于19年3月发售,简称为只狼,本作一经发售便广受好评,并且支持PS4、Xbox、PC三个版本,支持简... 来自: ygl19961996的博客 QT 创建文件夹 bool QDir::mkdir ( const QString &amp; dirName ) const 创建一个子目录名为目录名。[喝小酒的网摘]http://blog.... 来自: K7的专栏 阅读内容为:FX系列微型可编程控制器用户手册(通讯篇)中计算机链接功能章节。 采用本方法通信,pc端的实现,其实就是,把操作按照协议(2种)翻译成相应的字符串,通过串口发送给plc。 编写一应用程... 来自: pengjc2001的博客 转载请标明出处(请勿转载删除底部微博、微信等信息): http://blog.csdn.net/Y1258429182/article/details/51265160 本文出自:杨哲... 来自: 杨哲丶的专栏 最近一直在准备面试,为了使自己的Java水平更上一个档次,拜读了李林峰老师的《Netty权威指南》,了解了Java关于IO的发展和最新的技术,真是受益匪浅,现在把我总结的关于BIO、NIO和AIO的区... 来自: 我的编程世界 机器视觉学习笔记(6)——双目摄像机标定参数说明标签: 机器视觉阅读本文之前请先阅读以下两篇博文: 机器视觉学习笔记(4)——单目摄像机标定参数说明 机器视觉学习笔记(5)——基于OpenCV的单... 来自: moverzp的博客 一、定义状态(State)模式又称为状态对象模式(Pattern of Objects for State),状态模式是对象的行为模式。状态模式允许一个对象在其内部状态改变时改变其行为,用于解决系统中... 来自: 小小本科生成长之路 Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的Thread... 来自: u011860731的专栏 对于J2EE项目导入导出Excel是最普通和实用功能,本工具类使用步骤简单,功能强大,只需要对实体类进行简单的注解就能实现导入导出功能,导入导出操作的都是实体对象. 请看一下这个类都有哪些功能: 来自: 李坤 大米时代 第五期 问题场景描述整个项目通过Maven构建,大致结构如下: 核心Spring框架一个module spring-boot-base service和dao一个module server-core 提供系统... 来自: 开发随笔 最近想写个图书管理软件,用到了数据库,但是由于是小白,弄了好半天才把数据库搞明白。虽然网上有一些教程,但大多都是长长的文字叙述,所以想写一个图文版的连接教程并把这两天的经验记录下来。 1、首先打开ac... 来自: u012784288的博客 之前在做项目中,Json 这种数据转换格式经常用,为什么呢?我认为是 1、它的易用性,跨平台性,它是JS(JavaScript)的子集,是一种对象字面量。 2、它与XML都是树结构的语法树; 来自: qq_34417408的博客 *--文本文件的编码格式手动查看方法:*--用记事本打开文本后,点击菜单上的“另存为”,编码格式在出现的对话框下方。*--那用VFP如何取得文本文件的编码格式呢,如下:lcFileName=C:/A.... 来自: apple_8180(十豆三) 的专栏 功能点:轮播;列表,下拉刷新上拉加载更多;地图;网络请求;数据绑定等 文本仿照了 找事吧app 附近三公里功能,并感谢找事吧数据的提供。考虑到数据的私密性,本文贴出的代码并没有贴出请求URL,敬... 来自: 阿东 如题,近几天在利用Kettle进行数据迁移的工作(也就是把数据全量导入到新数据库中,其中有些字段有些许调整),在写好脚本并执行后发现一个很严重的问题——每次脚本在执行到某个位置的时候就会意外停止,如下... 来自: Amour 很多人在用selenium定位页面元素的时候会遇到定位不到的问题,明明元素就在那儿,用firebug也可以看到,就是定位不到,这种情况很有可能是frame在搞鬼(原因之一,改天专门说说定位不到元素,可... 来自: 灰蓝 记录下完全分布式HBase数据库安装步骤准备3台机器:10.202.7.191 / 10.202.7.139 / 10.202.9.89所需准备的Jar包: jdk-7u65-linux-x64.ta... 来自: Dobbin Sparksql 一个错误:org.apache.spark.sql.AnalysisException: character ' ' not supported here;

阅读数 15703

使用ES做简单的时间条件过滤+模糊查询+精确匹配+关键字排除

阅读数 14989

Hbase 大表快速count

阅读数 11256