精华内容
下载资源
问答
  • 临时取数需求
    千次阅读
    2022-07-23 06:52:24

    1. 写在前面的话

    在开发数据库时,特别是写存储过程,遇到比较复杂的需求,使用临时表可以简化很多逻辑。曾经在一家互联网金融公司供职,公司数据组团队做数据清洗,写SQL脚本时,一个查询语句可以套到数层查询,甚至十几层。看起来几百行上千行的脚本,其实他只是一个查询,就是说是一个select基于另一个select的结果。这样层层叠叠,同时还包含了聚合、排序、关联、联合等,看起来是相当的费劲,头疼。

    就如下列样式:

    
    SELECT
    	T1.A1,
    	T1.A2,
    	T1.A3...
    FROM
    	(
    		SELECT
    			T2.B1,
    			T2.B2,
    			T2.B3...
    		FROM
    			(
    				SELECT
    					...
    				UNION ALL
    					SELECT
    						...)
    					WHERE
    						...
    					GROUP BY
    						...) T1,
    						(
    							SELECT
    								T3.C1,
    								T3.C2,
    								T3.C3...
    							FROM
    								(
    									SELECT
    										...)
    									WHERE
    										...
    									GROUP BY
    										...) T3
    									WHERE
    										T1.A1 = T3.C1...
    	
    

    如果这里能使用临时表,那么就会使逻辑清晰很多,查询效率也会得到提升。比如在多处使用到同一个查询的结果时,就可以只执行一次查询,将结果保存为临时表,在查询过程中每次使用到时,直接从临时表查就可以了,不用每次使用都再去查询一遍原始数据,尤其是对于复杂关联查询结果。

    当时数据是来源于呼叫中心,每天都会产生几百万行数据,一个月就上亿行的数据量,就当时的机器性能基础上,在这个数据量来做统计操作,如果没有高效的脚本,是非常耗时间的。同时,数据组职员并没有专业数据库设计能力。

    本文以数据库World为例进行说明。

    2. 临时表的使用

    World数据库中数据表country放着全世界国家的相关信息。

    2.1 创建一个只存放亚洲国家信息的临时表

    2.1.1 创建临时表

    创建一个只存放亚洲国家信息的临时表,命名为TempAsiaCountries
    这里临时只取四个字段Code,Name,SufaceArea,Population,那么创建临时表的脚本如下:

    # 创建临时表
    CREATE TEMPORARY TABLE TempAsiaCountries (
    	`Code` VARCHAR (10),
    	`name` VARCHAR (30),
    	`SufaceArea` NUMERIC,
    	`Population` NUMERIC
    );
    

    创建完之后,会发现在数据库的表目录下并没有这个表,因为表是临时的,所以不会出现在表目录里。
    在这里插入图片描述

    2.1.2 向临时表里写数据

    如同写实体表数据一样,可以通过INSERT INTO 关键字进行表插入数据操作。

    # 写数据到临时表
    INSERT INTO TempAsiaCountries
    SELECT
    	`Code`,
    	`Name`,
    	`SurfaceArea`,
    	`Population`
    FROM
    	country
    WHERE
    	`Continent` = 'Asia';
    

    此时,可以通过SELECT操作查询临时表里的数据。

    2.2 在查询过程中直接创建临时表

    在实际使用临时表时,可以更快速便捷的创建临时表,如下脚本,直接以查询结果创建临时表的方法。

    
    CREATE TEMPORARY TABLE TempAsiaCountries 
    SELECT
    	`Code`,
    	`Name`,
    	`SurfaceArea`,
    	`Population`
    FROM
    	country
    WHERE
    	`Continent` = 'Asia';
    

    2.3 查询临时表中的数据

    对临时表的查询操作与实体表一样,如下是查询前文中所创建的临时表中的数据

    # 查询临时表
    SELECT *
    FROM TempAsiaCountries;
    

    可以看到查询结果
    在这里插入图片描述

    2.4 删除临时表

    # 删除临时表
    DROP TABLE TempAsiaCountries;
    

    此时再查,就会返回表不存在的结果
    在这里插入图片描述

    3. 以上操作的全部代码

    # 创建临时表
    CREATE TEMPORARY TABLE TempAsiaCountries (
    	`Code` VARCHAR (10),
    	`name` VARCHAR (30),
    	`SufaceArea` NUMERIC,
    	`Population` NUMERIC
    );
    
    # 第一种
    # 写数据到临时表
    INSERT INTO TempAsiaCountries
    SELECT
    	`Code`,
    	`Name`,
    	`SurfaceArea`,
    	`Population`
    FROM
    	country
    WHERE
    	`Continent` = 'Asia';
    
    # 查询临时表
    SELECT *
    FROM TempAsiaCountries;
    
    # 第二种
    # 查询数据并写到临时表中
    CREATE TEMPORARY TABLE TempAsiaCountries 
    SELECT
    	`Code`,
    	`Name`,
    	`SurfaceArea`,
    	`Population`
    FROM
    	country
    WHERE
    	`Continent` = 'Asia';
    
    # 删除临时表
    DROP TABLE TempAsiaCountries;
    
    
    

    总结

    临时表在使用上与实体表没任何区别,实事他们的区别也就是”临时“二字。临时表是在查询过程中依据需要创建,并在使用完后删除的表结构。表可以暂存于内存中,也可以暂存在硬盘上。

    在SqlServer中的临时表操作有全局临时表和局部临时表区分,他们分别用**#表名##表名**来表示,其中全局临时表并不会随着用户的退出而消失,而且其它用户也可使用。

    在MySQL中似乎没有这个区分。

    更多相关内容
  • 自助取数

    千次阅读 2019-08-26 21:07:31
    写过一篇《为什么BI取数这么难?》,今天来来谈一谈如何打造一个自助取数平台,仅是一家之言,欢迎拍砖。 首先,自助取数平台很难买到。 也就是,你很难找到符合你企业要求的通用产品,诸如BAT等企业内部的自助取数...

    为什么BI取数这么难?

    • 取数的量非常大。取数的量远远超过报表的量,因为报表往往是成形的指标的系统固化,而取数往往是具有探索性和分析型
    • 沟通成本高 。做分析,讲究的是个数据探索,探索本来是个不确定的事情,而且需要反复迭代,取数中业务人员和取数人员的沟通成本是很大的,两个不同背景的人,在业务口径和数据口径上要达到统一,对于双方要求都很高。
    • 取数对于BI的人员要求其实很高。要成为取数专家,特别强调的一点是一定要理解源系统数据,只有这样才能理解数据仓库模型的本质,才能更好的理解业务需求,通过刻意训练,你成为了公司内唯一能够连接起业务人员、仓库人员、源系统开发人员的桥梁,你才可能成为专家。专家不仅仅是满足需求的人,还能主动创造需求和给出建议,比如能对于数据仓库的模型提出改进意见,能对业务人员提出的需求进行质疑,这都来源于你对于数据认知的深度,但这样的人,其实很少,因为需要刻意训练。当然取数人员不仅需要专,也需要广,这又是为什么?数据分析的价值在于多领域数据的融合分析,这就需要取数人员对于公司的大多领域数据要有充分的掌握,数据广度往往决定了取数人员的视野,也决定了其发展潜力。
    • 取数要能自动化,但这个真得很难。除了增强取数人员本身能力,还有什么办法让取数越快呢?那就是自动化,平台化。取数不总是那么变幻万千,它也是有一定规律的,这为自动化提供了可能,比如有两类典型取数类型,营销清单型和复杂分析型,营销清单型,往往跟一线执行相关,70-80%的规则是比较简单的,通过配置往往就可以提供,复杂分析型,则规则比较难抽象,但也是有规律可循的。当然这类取数平台建设比较艰难,除了体验要好,性能要高,还要去做持续的运营,而且改变业务人员取数习惯很难。
    • 在这个大数据时代,取数人员还是要与时俱进。以前报表取数人员横跨业务和数据,号称是企业的综合型人才,但现在已经远远不够了。为什么?大数据时代技术突飞猛进,随着数据量的变化,IOE已经无法走遍天下了,你要取数取得快,需要升级你的平台引擎了,我能打造更牛逼的自助取数平台吗?最近也一直在问,我们传统企业的取数挖掘,能不能全部搬到SPARK?大数据结构越来越复杂,业务场景越来越多,SQL显然不够用了,我们的取数人员未来是不是要掌握各类语言,以适应不同的取数场景?比如,能否取出近3分钟的上网流数据并统计给我?能否临时爬虫看看公司的负面舆情如何?大数据时代更强调算法了,我们半路出家的取数人员,如果面对业务人员这个问题,该如何作答?能否给我取个数,看看杭州的公交司机有多少?这个还是传统的取数吗,是吗?不是吗?没必要去质疑业务人员,这个可能就是未来的临时取数需求,取数人员,准备好了吗?

    自助取数的优点

    (1) 能自助解决至少50%以上的取数需求;
    (2) 取数标准化,不易出错;
    (3) 速度更快,一般在30分钟;
    (4) 取数在线化,经验获得传承;

    BI自助取数是怎么炼成的

    自助取数平台是依据企业现状提供的数据解决方案

    首先,自助取数平台很难买到。

    也就是,你很难找到符合你企业要求的通用产品,诸如BAT等企业内部的自助取数工具,一般也是自研的,为什么?

    一是自助取数是个极度重视数据处理的工具,不仅需要一张可视化的皮,更需要依据企业现状提供数据解决方案,也就是数据和功能紧耦合,很多功能需要根据数据的特点量身定做。

    比如,我这个企业有个上百亿记录的HBASE指标库,自助取数产品需要基于这个引擎进行,如何抉择?

    二是BI产品越往上走越垂直,到达客户操作一层,操控更加难以抽象,报表可视化可能业界已经有些操作的规则,无非是选择维度和指标,但取数到底怎么个取法并没有固定的套路,它又写又读又查询又分析的,一个字:复杂。

    三是自助取数受企业的业务特点影响太大了,有些企业,以清单级的关联取数为主,有些企业,以复杂的汇总分析取数为主,有些企业,取数逻辑简单,但查询的速度要求却很高,不同的业务需求对于自助取数引擎要求可能很大不同,只有基于企业的特点才能得到一个妥协的方案。

    四是自助取数迭代要求偏高,企业的数据和分析变换万千,取数要素也必然随之要不停更新,这个工具显然要持续运营的,而产品化的东西,感觉很难跟上。

    话说,淘宝魔方本质上也是个自助取数平台,但这个能买得到吗?它其实也很难抽象成通用的产品,只适合电商,甚至只适合淘宝。

    其实可以类比,为什么这么多行业分别需要建立自己的C R M系统,市面上不是有很多C R M产品吗,自助取数道理跟它一样,没有包打天下的C R M,也就没有包打天下的取数工具,况且,数据的维度组合无限,而CRM好歹功能算是有限。

    BI自助取数要么自研,要么定制开发,很难奢望能有一个通用产品能真正符合要求,这由其特点决定。

    自助取数只能解决通用类取数问题

    其次,务必做好自助取数的可行性判断。

    自助取数很能完全替代人,想想也不可能,比如市场综合分析人员冒出的那种海阔天空的分析取数要求,在取数的时候涉及复杂的关联、跟踪等操作,自助取数很难支撑,即使勉强支撑,也会导致功能的极其复杂,带来体验的极度下降。

    取数有个特点,越偏向管理,越难取,规则越无法抽象,比如一般取数的难度排名如下:老大-领导-主管-分析-营销-执行,原因很简单,层级越高,人的自主性越大,越不可捉摸,如果老大怎么想的规律被你抓到了,就不要玩了。

    因此,自助取数实际只能解决部分问题,到底有没有价值,值不值得做,这就需要事先进行客观的评估

    幸好,一个企业的取数,往往简单通用类的取数还是占据了大部,这为特定企业自助取数工具的成功奠定了基础,比如某些运营商,一线简单的营销清单类取数,规则比较简单,且占到总取数量的60%到80%,而大多时候,这些取数还是在靠IT支撑人员写一个个脚本在取,效率可想而知,这让自助取数工具有了用武之地。

    因此,自助取数也是有点时势造英雄的感觉,不在那个行业,没有那个条件,就不要轻易上马一个自助取数项目。

    做好数据需求分析和功能分析

    第三,做好自助取数需求的分析,这决定了工具的成败。

    自助取数的需求分析是很艰难的工作,有两项最为重要的工作,一是数据需求分析,二是功能分析。

    针对数据进行分析,需要对历史的取数工单进行系统分析,至少能得出以下结论,字段属性的排名并作取舍,模型的分析并作取舍,要做到这个,需要对于企业的业务和数据有全局而深入的理解。

    本质上,自助取数是面向业务的,不是一个纯技术活,这也是自助取数很难产品化的原因。

    有一点特别要提,理论上做一张大宽表是体验最好的,但由于维度的限制,这是不可能的,因此,数据建模师就很重要了,设计需要达到很高的性价比,为了符合取数的特点,甚至需要全新打造一套新的取数数据模型。

    功能则需要调研,类似于设计产品,必须到一线中去了解需要哪些功能,怎么设计最好的配置方式,如何方便的找到相关模型、如何做好业务和数据的映射、如何方便的进行关联、如何方便的选择属性、如何方便的进行在线分析、如何方便的调度和监控、如何方便的导入导出数据、如何与现有的取数流程进行自动衔接、如何进行SQL解析、是否需要打造一个取数社区等等。

    下图是一张系统架构的示例,供参考。
    在这里插入图片描述
    最后就是要做出高保真设计,让业务人员试用,一定要简单简单再简单。最好不要培训也会配,你可以设计成4步法或者5步法,步数越多,则会大幅增加工具的使用门槛,比如:

    第一步,基本信息填写:填写取数的基本信息,包括业务目的、业务口径等信息。

    第二步,选取合适的取数模型:可以通过标签及搜索的方式从取数模型库中选取合适的模型。

    第三步,取数模型配置:对取数模型的配置主要包括三个方面,一是对模型输出结果的勾选,二是业务筛选条件的配置,三是外部数据的配置,允许导入外部数据,以及对取数结果进行特殊剔除等。

    第四步,模型间组合(可选):选择两个以上的模型,可以通过拖拽的方式对模型进行自由组合。

    第五步,取数任务执行:配置完数据的地域和时间范围之后即可提交取数。 取数模型选择
    在这里插入图片描述
    在这里插入图片描述
    取数任务执行

    第四,运营是临门一脚,业务人员不是一张白纸。

    取数作为企业的一项基础工作,传统取数的方式和流程已经成为套路,自助取数工具作为一种新的支撑手段,是对传统方式的挑战,即使产品再好,也需要做好内部的运营推广。

    曾经将研发的自助取数叫作取数机器人,强调了其自动化的特性,宣传口号是“完全自助,永远在线,极简操控,知识共享”。

    事实上,很多企业业务人员提出取数需求的代价并不高,取数也是企业的一项刚性成本投入,要改变流程和习惯并不容易,这就更考验产品的能力。

    况且自助取数与一般的企业内生产系统不同,其并不是必需的,人工取数是它最大的竞争对手,需要接受业务人员的最挑剔眼光。

    即使做过很多企业内部推广,还是有不少一线单位没有使用,究其原因,一是工具还没好到一定程度,二是缺乏持续的运营推广,三是企业人工取数成本太低,如果搞个虚拟结算估计会好很多,呵呵。

    第五,不同企业效果可能不同,但成功还是可期。

    当然,运营的效果还是要数据说话,说啥都是虚的,可以看到,后续自助的比例稳定在50%左右。不少企业能做到80%以上,也是令人非常羡慕的。
    在这里插入图片描述
    同时发现,一旦自助取数被投入实用,往往会大幅激发潜在取数需求,这对于公司是好事,说明原有的靠人工取数的方式已经抑制了大量的数据需求,信息技术的确是生产力,它让我们分析的成本、迭代的成本间接降低了。

    自助取数的速度依赖于使用的技术引擎和取数复杂度,一般可以达到小时或半小时,这个已经远远低于传统的按天的人工取数周期了。

    同时,自助取数的永远在线、口径的标准化、知识传承及很少出错也是其天然的优势。

    第六,给用户足够的自主权。

    自助取数最大的变数是业务,业务会带来数据模型的快速变化,因此需要最大可能的提供一线用户的模型自主权,因此,即使项目前期做了大量的数据调研,也务必能够让一线人员能够自行定制模型表,这也是一种开放化的思维。

    实际上,自助取数演变到现在,一线专业人员自行开发配置的模型已经占到了60%以上。因此,我们需要做这个发动机,一旦自助取数工具能够启动,也许,星星之火,就能燎原了。

    当然,自助取数工具还有大量的问题,需要去持续解决。

    自助取数强调关联查询的实时分析能力,原来的自助取数工具,是基于IOE的,这个性能的瓶颈显然是很难解决的,包括在线、实时等计算分析能力,这给用户的体验造成了极大的困惑,对于自助取数,平均半个小时显然也太长了。

    因此很羡慕BAT,其较传统企业,通过技术自主创新,还是能领先一步,诸如淘宝魔方这种所见即所得的取数方式,正是我们孜孜以求的,而这个靠购买产品的方式,显然很难。

    当然,如果有厂家能解决前面我提到的问题,也许真的能打造出通用的PaaS取数平台也不一定,但相信肯定是一体化解决方案,而不是轻量级的一个工具。

    由此想到了大数据,最近也在考虑MPP等数据库替代方案,比如GBASE、EXDATA啥的应该更好一点,但显然无法达到实时水平,也许IMPALA/SPARK等也可以尝试一下,无论如何,如果自助取数能移植到大数据平台上,还是能推动企业数据生产力的大幅提升。

    要承认,当前自助取数工具对于清单级的取数也许支撑的还可以,但对于汇总分析类的取数支撑难度就上了一个量级,因为一旦分析表格太复杂,自助配置复杂度也将达到一个量级,这就失去了自助的意义。

    也许,并不存在完美的自助取数,直接开放最终数据给业务人员,可能才是终极解决之道,再牛逼的工具或产品,在无边的数据形式面前,也需要妥协。

    参考:《BI自助取数是怎么炼成的》傅一平 链接:https://www.jianshu.com/p/9ea284bbb33a 来源:简书
    《为什么BI取数这么难?》 傅一平 链接:https://www.jianshu.com/p/4e240eba4b7f 来源:简书

    展开全文
  • 十幅图读懂BI自助取数系统!

    千次阅读 2019-12-04 08:15:00
    点击上方蓝字关注公众号!请您点击“与数据同行”以“关注”,关于数据的实践与思考,每周一我在这里等你!作者:傅一平 浙江大学博士毕业 当前就职于浙江移动有5年没有做报表取数了,但现在总...

    点击上方蓝字关注公众号

    请您点击“与数据同行”以“关注”,关于数据的实践与思考,每周一我在这里等你!

    作者:傅一平 浙江大学博士毕业  当前就职于浙江移动 

    有5年没有做报表取数了,但现在总是会想起取数的事,想到了现在还在欢乐运行着的自助取数系统,亲切的叫它”取数快点吧”,今天就来谈一谈这个系统 。


    一、总体思路

    在活字印刷出现以前,要印一本书很困难,需要根据书的内容刻成雕版,由于每本书的内容各不一样,需要为每本书单独刻成雕版,这样做既费事又费力。但是后来发现虽然每本书的内容千变万化,但是构成书的基本单元“字”是不变的,常用的中文字也就几千个,书无非是这些字的组合。后来毕昇发明的活字印刷术将每个字雕刻下来,形成活字,通过对活字的排版和组合来印刷书籍,大大提高了效率。

    我们的临时统计取数需求也面临着同样的问题,每个需求千变万化,口径各不一样,BI人员需要为其单独开发代码,效率低下。但是通过仔细分析可以发现,虽然业务口径各不一样,但是业务口径基本上是客户信息、各种业务量、产品订购关系和各种费用等条件的组合,也就是说构成业务口径的基本单元是有限的,只要具备了这些基本能力,就可以通过对这些基本能力的组合来满足各种业务需求。


    取数快点吧正是基于这样的思想,通过梳理出一系列原子的取数模型,每个取数模型对应一种基本的数据提取能力,然后采用向导式的、图形化的方式,通过对各个取数模型的组合来满足一个复杂的业务取数需求,改变过去依赖人工的方式,使得业务人员能够直接按需从数据仓库获取分析数据,包括以下几点:

    • 构建统一取数模型库,丰富基础的、单元性的数据提供能力

    • 打造向导式的数据机器人自助取数引擎,使得业务人员能够直接操作

    • 实现灵活的自助分析,满足业务人员更深层次的统计分析需求

    • 形成学习型的取数社区,通过不断的知识沉淀和共享来提升智能化数据提取能力

    二、取数模型

    一个取数模型由三大部分组成,分别是数据模型、业务筛选条件和输出业务指标。数据模型对应于数据库中的一个或者多个物理实体表,业务筛选条件是在数据模型基础上定义的条件参数,输出业务指标定义了取数模型最终能够输出的结果信息。取数模型本质上是对数据模型的一种封装,业务筛选条件是数据模型的输入,输出业务指标则是数据模型的输出。

    为了方便业务人员理解和使用,数据模型配置器中的“业务-数据转换配置”起到了数据向业务进行映射的作用,从而达到向业务人员隐藏技术细节,以业务语言进行展现的目的。以数据模型中的“套餐编号”这个属性为例,如果业务人员直接对“套餐编号”这个属性进行配置会觉得非常困难,而通过“业务-数据转换配置”可以将“套餐编号”重定义成“套餐类型”这个筛选条件,这个筛选条件下可以选择“动感校园套餐”、“动感社会套餐”等条件值,使得业务人员使用起来更为简单。

    在构建模型库的过程中,为提升业务人员的可用性和易用性,遵循了如下原则:

    • 可配置性原则:为了提高取数模型的灵活性,取数模型中的数据模型、业务筛选条件和输出业务指标均是可配置,可根据实际需求灵活调整,例如新增业务筛选条件等。

    • 业务指标相近性原则:通过分析历史的需求,将经常需要同时获取的信息放在一个模型中,使得模型更符合业务人员的使用习惯,例如模型同时提供客户最近三个月的ARPU信息等。

    • 筛选条件业务化原则:所有的筛选条件均需定义成业务人员可理解的形式,降低使用人员门槛。

    基于上述原则,对最近6个月的所有取数需求进行了分析和梳理,最终确定了近50个统一的取数模型,取数模型覆盖了业务人员常用的各种业务场景,以下是示例:


    三、自助向导

    如果说取数模型库解决了活字印刷术中制作活字问题的话,那么数据机器人引擎就用来解决对活字进行排版及印刷的问题。数据机器人引擎为业务人员提供了三个方面的核心能力:

    • 提供了一个公用的取数模型展现和对其操作的平台:数据机器人就像一个容器,允许取数模型库中的所有模型在这个平台上进行展示,并向业务人员提供了一个友好的操作界面,可以按照业务人员能够理解的方式对取数模型进行操作。

    • 提供了一个根据业务需求对取数模型进行自由组合的能力:单个取数模型的能力有限,无法满足一些复杂的业务需求,数据机器人允许业务人员对取数模型进行组合,从而具备了灵活应对各种业务需求的能力。

    • 提供了一个将业务操作结果转化为技术语言并提供最终结果的能力:数据机器人中的SQL解析和执行器负责将业务人员对取数模型的操作转化成机器能够识别的SQL语言,并提交数据库执行,最终将得到的取数结果反馈给业务人员。

    为了使得业务人员能够方便地完成自助取数,构建了一个向导式的、图形化的数据机器人引擎,通过自助数据机器人五步法即可快速地获取数据:

    第一步,基本信息填写:填写取数的基本信息,包括业务目的、业务口径等信息。

    第二步,选取合适的取数模型:可以通过标签及搜索的方式从取数模型库中选取合适的模型。

    第三步,取数模型配置:对取数模型的配置主要包括三个方面,一是对模型输出结果的勾选,二是业务筛选条件的配置,三是外部数据的配置,允许导入外部数据,以及对取数结果进行特殊剔除等。

    第四步,模型间组合(可选):选择两个以上的模型,可以通过拖拽的方式对模型进行自由组合。


    第五步,取数任务执行:配置完数据的地域和时间范围之后即可提交取数。


    当然,除了可视化配置,SQL高级模式也必然是要支持的。


    四、自助分析

    基于数据机器人自助取数结果,业务人员可以根据系统提供的自助分析功能进行灵活的、自由的分析,可以对结果按多个维度对指标进行汇总和分析,同时提供了图形分析和基础统计学分析能力,满足业务人员更深层次的分析需要。业务人员还可以将自助分析结果发布成周期性的统计报表,改变传统依靠技术人员手工开发报表的模式。


    五、取数社区

    取数快点吧同时是一个全省性的取数社区,大家的模型可以共享有无,系统对每次取数的业务口径、技术口径等信息进行了结构化,同时允许使用人员通过标签的方式对取数知识进行沉淀,以实现取数知识的全省共享。

    六、效果情况

    取数快点吧是一个相对比较简单的系统,但的确可以有效的提升取数效率,首先,人工取数量会下降,降幅达到30%左右,其次,业务人员潜在的需求得到释放,取数量增长了10倍,再次,取数需求的处理时间由原来人工方式的1-2天下降到30分钟左右 ,最后,取数可配置化后,错误会降低,知识会有传承,这是实实在在的好处。

    七、几点体会

    • BI自助取数系统是否建设依赖企业自身的情况,取数到达一定规模都可以考虑,但不是必须的,建设相对简单但运营困难,后续的优化迭代很重要。

    • BI自助取数系统适用场景是有限的,针对一线清单类取数需求最为合适,支撑的比例可以超过70%,探索类的复杂统计分析并不适用,但要相信一个企业主要的取数需求其实是非常简单的,要靠机器替代它。

    • 这里提的方式对于很多企业并不适用,更好的方式肯定是教会业务人员写简单的代码+提供租户能力,那个才是真正的搭台唱戏,但这个又有赖于企业的数据文化。

    • BI自助取数系统要尽量开放,特别是模型一块,可以让一线自主导入或开发,建系统的是无法理解一线的奇思妙想的数据需求的。

    • BI自助取数的后台引擎如果是ORACLE啥的,可以考虑大数据解决方案了,关联一下要30分钟跟几秒钟那是几何级的差距,对于一线体验影响是巨大的。

    • BI自助取数是只是取数的一种方式,需要与人工取数协同,让用户有多种选择,抢占入口,这样流量总会有的,初期对于提升用户很重要。



    • 这类系统前期最好定制建设,因为跟业务强相关,没人持续的呵护肯定会死的,大家都懂得。

    取数是BI最为重要的数据支撑手段,如果你从事取数相关工作,无论是新手还是老手,在疲惫的完成取数的时候,还是要留点时间给自己,想想有没有更好的支撑方法,这对于BI很重要。

    与数据同行

    ysjtx_fyp

    长按二维码识别,关注此号!

    展开全文
  • 华为新软件全过程管理资料,包括“需求分析+概要设计+详细设计+接口设计”的全套模板,方便您学习和临时取用。
  • File.createTempFile创建临时文件的示例详解API参数:/**fileName: 临时文件的名字, 生成后的文件名字将会是【fileName + 随机数】suffix: 文件后缀,例如.txt, .tmpparentFile: 临时文件目录,如果不指定,则默认...

    File.createTempFile创建临时文件的示例详解

    API参数:

    /**

    fileName: 临时文件的名字, 生成后的文件名字将会是【fileName + 随机数】

    suffix: 文件后缀,例如.txt, .tmp

    parentFile: 临时文件目录,如果不指定,则默认把临时文件存储于系统临时文件目录上

    */

    public static File createTempFile(String fileName,

    String suffix,

    File parentFile)

    代码如下:

    import java.io.File;

    import java.io.IOException;

    import java.io.File;

    import java.io.IOException;

    public class CreateTempFileTest

    {

    public static void main(String[] args) throws IOException

    {

    File tmp = File.createTempFile("lzq", ".tmp", new File("C:\\"));

    }

    }

    临时文件如图:

    16157ec990607c946399a2a9ce773add.png

    以上就是File.createTempFile创建临时文件的示例详解的详细内容,更多关于File.createTempFile创建临时文件详解的资料请关注我们其它相关文章!

    时间: 2020-07-12

    本文实例讲述了python创建临时文件夹的方法.分享给大家供大家参考.具体实现方法如下: import tempfile, os tempfd, tempname = tempfile.mkstemp('.suffix') os.write(tempfd, "aString") # or, if you want a file-object: os.fdopen(tempfd, 'w+') os.close(tempfd) os.unlink(tempname) 希望本文所述对大家的P

    6b5aa0751a6f1e6a9d0b665a02cc1f46.gif

    问题描述 最近在工作中遇到一个问题,MySQL 启动失败,错误日志: mysqld: Can't create/write to file '/tmp/ibfguTtC' (Errcode: 13) 说明/tmp目录无法写入 解决办法 使用命令 ll -d /tmp 命令检查目录权限 使用 chmod 1777 /tmp 设置为正确权限 启动成功 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持.

    本文实例讲述了C#创建临时文件的方法.分享给大家供大家参考.具体分析如下: C#可以通过Path.GetTempFileName获得一个临时文件,然后创建自己的临时文件 using System; using System.IO; class MainClass { static void Main() { string tempFile = Path.GetTempFileName(); Console.WriteLine("Using " + tempFile); using(Fi

    参数:pathname,存储临时文件的路径文件名,需要手动free()掉.dir,临时文件的路径,如果TMPDIR环境变量不为空,则此参数被忽略,转而使用环境变量.pfx,临时文件名的前缀,只使用前5个字符.注:创建的临时文件需要手动unlink()掉. 创建临时文件的函数 复制代码 代码如下: int  Make_temp_file(char **pathname,const char *dir,const char *pfx){ char *ptr,*tmp; size_t len; int

    6b5aa0751a6f1e6a9d0b665a02cc1f46.gif

    通过java的File类创建临时文件,然后在程序退出时自动删除临时文件.下面将通过创建一个JFrame界面,点击创建按钮在当前目录下面创建temp文件夹且创建一个以mytempfile******.tmp格式的文本文件.代码如下: 复制代码 代码如下: import java.io.*; import java.util.*; import javax.swing.*; import java.awt.event.*; /**  * 功能: 创建临时文件(在指定的路径下)  */ public

    1,验证传入路径是否为正确的路径名(Windows系统,其他系统未使用)Java代码 复制代码 代码如下: // 验证字符串是否为正确路径名的正则表达式  private static String matches = "[A-Za-z]:\\\\[^:?\">

    JDBC简介 Java数据库连接(Java Database Connectivity,JDBC),是一种用于执行SQL语句的Java API,它由一组用Java编程语言编写的类和接口组成. JDBC为数据库开发人员提供了一个标准的API,使他们能够用纯Java API来编写数据库应用程序. 使用JDBC编写的程序能够自动地将SQL语句传送给相应的数据库管理系统. JDBC扩展了Java的功能,由于Java语言本身的特点,使得JDBC具有简单.健壮.安全.可移植.获取方便等优势. 我们在没有JD

    8a06daea8e32b1e5dd5440a89a995e55.gif

    JavaScript 对象是词典 在 C++ 或 C# 中,在谈论对象时,是指类或结构的实例.对象有不同的属性和方法,具体取决于将它们实例化的模板(即类).而 JavaScript 对象却不是这样.在 JavaScript 中,对象只是一组名称/值对,就是说,将 JavaScript 对象视为包含字符串关键字的词典.我们可以使用熟悉的"."(点)运算符或"[]"运算符,来获得和设置对象的属性,这是在处理词典时通常采用的方法.以 下代码段 复制代码 代码如下: var

    Java 线程类也是一个 object 类,它的实例都继承自 java.lang.Thread 或其子类. 可以用如下方式用 java 中创建一个线程,执行该线程可以调用该线程的 start()方法: Tread thread = new Thread(); thread.start(); 在上面的例子中,我们并没有为线程编写运行代码,因此调用该方法后线程就终止了. 编写线程运行时执行的代码有两种方式:一种是创建 Thread 子类的一个实例并重写 run 方法,第二种是创建类的时候实现 Run

    0c00185056c31643f7948852f862028a.png

    本文实例讲述了C#通过创建Windows服务启动程序的方法.分享给大家供大家参考,具体如下: 1. 新建一个Windows服务应用程序 创建项目-->Visual C# 左侧的"+"-->Windows -->Windows 服务(右侧模板)-->输入名称,确定创建项目 2. 设置Windows服务的属性(Windows服务里没有窗体,所以点击左侧设计器里空白的地方即可在右侧属性栏里看到属性) 这里属性是控制服务器是否可以停止,暂停,继续等等的操作.根据需要选择

    java存储: 1)寄存器:这是最快的存储区,位于处理器的内部.但是寄存器的数量有限,所以寄存器根据需求进行分配.我们不能直接进行操作. 2)堆栈:位于通用RAM中,可以通过堆栈指针从处理器那里获取直接支持.堆栈指针往下移动,则分配新的内存.网上移动,则释放内存.但是 在创建程序的时候必须知道存储在堆栈中的所有项的具体生命周期,以便上下的移动指针.一般存储基本类型和java对象引用. 3)堆:位于通用RAM中,存放所有的java对象,不需要知道具体的生命周期. 4)常量存储:常量值通常直接存放在

    本文实例讲述了Android编程实现捕获程序异常退出时的错误log信息功能.分享给大家供大家参考,具体如下: 很多时候我们程序无缘无故的就挂掉了,让我们一头雾水,如果刚好我们在调试,那我们可以通过错误log来查看是什么原因引起的程序崩溃.但是当我们把程序发别人使用时,就没那么好运了,那我们要怎么样才能捕获到那个错误异常呢?还好Android给我们提供了UncaughtExceptionHandler 这个类,我们可以通过实现这个类的接口,来全局捕获那个让程序崩掉的错误log信息.可以将错误的lo

    创建和删除文件/目录常用的File类的方法 1.boolean exists():判断文件或目录是否存在 2.boolean createNewFile():创建新文件 3.boolean delete():删除文件 4.boolean mkdirs():递归创建多级目录 5.File getParentFile():获取上级目录 1.创建/删除文件 try { //在D盘demo目录新建文件:test.txt File file = new File("D:\\demo\\test.txt&q

    展开全文
  • 项目需求到设计的理解

    千次阅读 2019-08-28 10:25:44
    一个项目的开展也伴随...一般从宏观的角度上来看,对于一个设计的合理性也是决于需求理解的是否全面,根据设计倒逼需求是一个简单而直观的方式,那么从微观的角度上来讲每个阶段我们应该做些什么呢,今天为大家分...
  • 供给、需求关系

    千次阅读 2021-02-28 16:29:45
    这里是《西方经济学》的第一节自学笔记啦。笔记的形式应该会比较随意,更新时间也不会固定。...一种商品的需求是指消费者能在一定时期内在各种可能的价格水平愿意而且能够购买的该商品的数量。也就是说,需
  • 如何避免重要需求遗漏?

    千次阅读 2019-09-11 18:21:14
    避免重要需求遗漏的思路 避免重要需求遗漏,首先我们需要反问一句 —— 为...我们是否有提高或改善响应能力的空间,如果我们可以更快调整和响应,使得这些临时需求对我们产生不了什么影响,那么这个问题也就不再是...
  • 经常我们的程序中需要访问一些特殊的路径,比如程序所在的路径、用户目录路径、临时文件夹等。在 Qt 中实现这几个功能所用的方法虽然都不难,但是各不相同,每次用到时还要现去查,很不方便。因此就写了这篇博客,把...
  • linux修改TCP最大连接

    千次阅读 2021-05-10 10:16:52
    环境操作系统: oracle-linux7.3修改系统支持的最大TCP连接最大tcp连接和系统允许打开的最大文件,用户允许打开的最大文件,TCP网络连接可用的端口范围有关,上述的最小值;一般的设置规则为:系统最大文件...
  • python最小值

    千次阅读 2020-11-25 11:43:15
    实现如下:t = xx = yy = tpythonic,对于这种需求其实python为我们提供了一种更方便的解决... 1122max() 最大值min() 最小值pow() 求幂round()四舍五入sum() 求和sorted() 排序:(想要排序必须是同一种类型,...
  • //拆分(按正负),也可以根据需求改 //虽然思想略简单,但是要写的没有错误,还是需要锻炼coding能力的 Status InitList(SqList *L) { L->length = 0;//长度为0 return OK; } Status ListInsert(SqList *L, int i,...
  • 基于mysql实现group by各分组最新一条数据前言:group by函数后到的是分组中的第一条数据,但是我们有时候需要取出各分组的最新一条,该怎么实现呢?本文提供两种实现方式。一、准备数据二、三种实现方式1)先...
  • mysql group by 函数 分组后排序第一条数据 select aa.* from 你的操作的表名 as aa right join ( select 分组的那一列列名, max(排序的那一列列名+0) as max from 你的操作的表名 group by 分组的那一列列名 ...
  • def pop(self): """ 出栈函数, """ return self.stack.pop() def gettop(self): """ 栈顶 """ return self.stack[-1] def __len__(self): return len(self.stack) stack1 = Stack() list1 = [] def ...
  • 需求分析

    万次阅读 多人点赞 2018-09-28 18:32:02
    1、确定对系统的综合要求:功能需求、性能需求、可靠性和可用性需求、出错处理需求、接口需求、约束(设计约束或实现约束描述在设计或实现应用系统时应遵守的限制约束条件)、逆向需求(说明软件系统不应该做什么)...
  • 表变量与临时表的优缺点

    万次阅读 2016-02-28 17:57:21
    表变量:   DECLARE @tb table(id int identity(1,1), name varchar(100))     INSERT @tb  SELECT id, name FROM mytable WHERE name like ‘zhang%’  ...临时表:   SELECT name, address  INT
  • 固化查询:指对一些固化下来的取数、看需求,通过数据产品的形式提供给用户,从而提高数据分析和运营的效率。这类需求的SQL有固定的模式,对响应时间有比较高的要求。我们针对即席查询提供了Hive和Presto两个...
  • /tmp/tomcat.1668302398522753093.8383 内置的tomcat需要创建临时目录来存放上传的文件, 当POST请求的content-type是multipart/form-data的时候就会访问这个目录, 而这个目录在Linux系统中默认建在/tmp目录下, 10天...
  • 固化查询:指对一些固化下来的取数、看需求,通过数据产品的形式提供给用户,从而提高数据分析和运营的效率。这类需求的SQL有固定的模式,对响应时间有比较高的要求。我们针对即席查询提供了Hive和Presto两个...
  • 计算到m行,打印出k项第m行有m项,m是正整数,因此k一定不会大于m,这个需求需要保存m行的数据,那么可以使用一个嵌套结构[[],[],[]]m=int(input('行>>>'))k=int(input('第几个>>>'))triangle=...
  • mysql优化(连接、最大并发

    千次阅读 2021-05-10 13:53:12
    1.2.1、方式一:实时(临时)修改此参数的值 1.2.2、方式二:在配置文件my.ini中设置max_connections的值 2、max_used_connections查看最大连接 3、max_user_connections 每个MySQL用户的最大连接 3.1、查看...
  • PostgreSQL中计算百分位数和中位

    千次阅读 2021-05-11 21:38:40
    PostgreSQL9.4版本之后很容易对一组值计算百分位数,主要是用有序...更精确,包括两个输入值直接的(带小数)。 下面通过示例进行讲解,首先我们准备一个示例表和数据。 create table thing ( value int ); ins
  • 超硬核!数据结构学霸笔记,考试面试吹牛就靠它

    万次阅读 多人点赞 2021-03-26 11:11:21
    自于某个特定对象的集合 输出:一个或多个输出 设计要求:正确性、可读性、健壮性、效率与低存储量需求。 执行频度概念:是指通过统计算法的每一条指令的执行次数得到的。 执行频度=算法中每一条语句执行次数的和 ...
  •  “在正式讲解需求之前,咱们先来了解一下公司的业务现状,”,小Q觉得即便是程序员,也非常有必要先了解一下业务背景,以需求为出发点,才能设计出更贴合业务的系统,而且也会更加有参与感。    “①咱们...
  • mysql通过group by分组最大时间对应的数据,提供两种有效方法。
  • 一、需要实现分组排序并且组内状态优先级最高的数据有一张这样的数据表, 需求是根据error_type分组然后status最小的第一条数据第一种写法:select t.* from (select e.* from error_record e where e.status >...
  • db2 系统临时表空间

    万次阅读 2014-05-26 14:28:15
    确保系统临时表空间的页大小符合要求 更大记录标识符(RID)的使用增加了来自查询或定位更新的结果集的行大小。如果结果集中的行大小接近于现有系统临时表空间的最大行长度限制,那么可能需要创建具有更大页大小...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 80,570
精华内容 32,228
热门标签
关键字:

临时取数需求