精华内容
下载资源
问答
  • 中型企业数据库产品选型

    万次阅读 热门讨论 2008-09-09 22:19:00
    免费的有免费的好处,商业的也有商业的优势,一般来讲,小型的企业和一些传统的门户网站大都采用免费的软件,而大企业都采用商业的软件,因为商业的软件对数据的安全性、易用性等都提供了一个比较好的解决方案。...

       目前的数据库市场,主要是Oracle、Mysql、IBM的DB2和微软的sqlserver,其中mysql是免费的,其他三款都是比较优秀的商业软件。免费的有免费的好处,商业的也有商业的优势,一般来讲,小型的企业和一些传统的门户网站大都采用免费的软件,而大中型企业都采用商业的软件,因为商业的软件对数据的安全性、易用性等都提供了一个比较好的解决方案。那么哪款数据库产品最适合中型企业使用呢?

       中型企业该如何去选择适合的数据库产品呢?一般来讲,侧重于产品的安全性、易用性以及性价比这些方面,因为大部分数据库产品都能满足数据存储和处理的要求。IBM的DB2一直走的是高端路线,侧重于大型数据库应用,也需要高端的服务器来支持。微软的sqlserver也比较适合小型企业,因为比较简单易用而且比较便宜,.NET开发一般都选用sqlserver来做数据库,属于比较低端的一款数据库产品,Oracle数据库长期以来都集中在大中企业市场,在高端市场的占有率很高,价格也比较高,但是Oracle11g以后,他专门为中型企业量身定做了一个版本,跟同性能的数据库产品相比,价格也有了很大的竞争优势。还有就是Oracle11g操作比较简便。中型企业的技术力量一般不是很强,一般会去选择操作简单的数据库产品,Oracle11g显然是吸取了这一经验教训,改进了操作方式,提供了大量的自动化,让其使用起来更为简单。

       从个人角度来讲,我对Oracle11g的新特性比较感兴趣。sql的自动优化,分区建议,数据压缩等都是非常适用的功能,可以有效降低数据库技术人员的学习和维护的成本。从技术的角度来讲,原理学的越明白越好,从实用的角度来讲,简单易用还是很重要的。所以,建议中型企业选择数据库产品,首先考虑oracle11g的中型企业版本,尤其是用java开发的应用系统所使用的数据库。

      

    展开全文
  • 从运维角度浅谈MySQL数据库优化,中小企业DBA必会

    千次阅读 多人点赞 2019-06-06 18:28:03
    一个成熟的数据库架构并不是一开始设计就具备高可用、高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善。这篇博文主要谈MySQL数据库发展周期所面临的问题及优化方案...
    展开全文
  • 数据库

    千次阅读 多人点赞 2020-03-05 16:39:37
    1.什么是数据库 数据库:英文为Databsae,简称DB 数据库是按照数据结构来组织,存储和管理数据的仓库 简而言之,数据库就是*存储数据的仓库* 2.数据库的分类 数据库根据句存储采用的数据结构的不同可以分为许多种,...

    1.什么是数据库

      数据库:英文为Databsae,简称DB
      数据库是按照数据结构来组织,存储和管理数据的仓库
      简而言之,数据库就是*存储数据的仓库*
    

    2.数据库的分类

      数据库根据句存储采用的数据结构的不同可以分为许多种,其中包含早期的*层次式数据库*,*网络式数据库*.
      目前占市场主流的是*关系型数据库*,当然还有*非关系型数据库*(键值对数据库,例如:MongDB,Redis)等其他类型的数据库
    

    3.什么是关系型数据库

      底层是以二维表的及其之间的关系所组成的数据库.
      例如:
    

    在这里插入图片描述

    4.常见的关系型数据库

    SQL Server           微软提供(收费.java中使用不多)
    Oracle               甲骨文公司(收费,功能强大,性能优异,java中使用者很多)
    DB2                  IBM(收费,中型/大型,银行/电信等企业)
    MySQL                瑞典MySQL AB(免费,小型,性能较优异,适用于中小型项目,可集群)
    SQLite               迷你数据库
    

    5.名词解释

    5.1.数据库服务器

    数据库服务器其实就是一个软件,比如我们安装的mysql软件(或者mariadb软件)
    mysql服务器软件需要安装在服务器硬件上(就是一台计算机)才可以让外界来访问
    

    5.2.数据库

    在mysql服务器中,可以创建很多的数据库(database)

    5.3.数据表

    在数据库(database)中,可以创建很多张表(table)
    通常情况下,一张表用于保存一类数据,例如网站中的所有用户信息会保存在一张表中,所有商品信息会保存在另一张表中

    5.4.表记录

    在数据表中(table)中,可以插入很多条记录
    数据表往往保存一类数据,对应java中的一个类
    而一条记录往往对应java中的一个具体的实例
    在这里插入图片描述

    6.什么是SQL语言

    Structured Query Language:结构化的查询语言
    SQL是操作所有关系型数据库的通用的语言
    SQL语言的分类:
    a) DDL - - 数据库定义语言,指Create,Allter,Drop等操作(即创建,删除,修改数据库和数据表)
    b) DML - - 数据库操作语言,指Insert.Update.Delete等操作(即数据表中数据的增删改操作)
    c) DQL - - 数据查询语言(指Selete操作,即数据表中数据的查询操作)

    其中DQL,也就是数据查询操作是在开发中使用最多的操作,也是我们关注的重点.

    展开全文
  • 工业企业数据库处理——2.匹配样本

    万次阅读 热门讨论 2015-01-09 22:49:53
    工业企业数据库处理之样本匹配程序注解。
    
    

    匹配样本的程序主要来自于下面这篇文献:

    Brandt, L., et al. (2012). "Creative accounting or creative destruction? Firm-level productivity growth in Chinese manufacturing."Journal of Development Economic 97(2): 339-351.


    作者公开了自己的代码,下载链接地址:http://feb.kuleuven.be/public/n07057/China/

    其中一部分就是匹配样本,这里算是记录了自己对作者程序的注解。



    样本匹配问题的由来:
    对于一个多年企业数据来说,整理数据的第一步就是构建一个以企业ID和年份作为两维的面板数据。这通常并不是个问题,但对于中国工业企业数据库来说确是一个非常棘手的问题。因为在该数据库中,难以找到一个识别每一个样本企业的唯一特征来进行编码。通常的做法是,根据企业代码、企业名称、法人代表姓名、地址、邮编、电话、行业代码、主要产品名称、开业时间等基本信息来识别不同的样本点是否来自于同一家企业。但是因为这些基本信息在申报时并没有统一格式,在缺乏有效的智能模糊匹配手段的情况下,精确匹配的可操作性不强。这其中,企业代码和企业名称的准确性相对较高,可以作为我们进行匹配所依据的主要信息,比如Brandt 等(2012)就是先根据相同的企业代码识别同一家企业,然后再根据相同的企业名称进行识别,最后再参考其他信息。这种贯序识别法嘉定企业代码的准确性最高,企业名称准确性次之,也就是说共享同一企业代码的样本点必然被识别为同一企业,反过来,被识别为统一企业的样本点可能拥有不同的企业代码。在本数据库中,不但存在统一企业更改企业代码的情况(例如发生改制或者重组之后),更重要的是,还存在不同的企业共享企业代码的情况(可能是统计错误)。企业名称这一变量也存在类似问题。很多企业在改制、重组或者扩张时更改了企业名称。例如,中国有不少企业先是叫“XX厂”,然后改名叫“XX有限责任公司”,接着又叫“XX股份有限公司”。有时企业名称中的地理位置也略有差异,例如从“XX市机电厂”变成“XX机电厂”。如果按照企业名称进行精确匹配会错误地识别出“过多”的企业。


    Stata程序

    第一部分,从预处理的数据中保留下基本的用于match的变量。包括:法人代码、企业名称、法人、地址、省份等等信息。分别保存为m1998.dta~m2007.dta。

    clear all
    set more off
    
    global PATH "/Volumes/TOSHIBA EXT/Projects/NBS/China Industry Business Performance Data/Match Over Years"
    cd "$PATH"
    
    ******************************************************************************
    * Part 1 
    * Befor run this do-file, orignial_1998.dta ~ original_2007 must be already 
    * generated. Whic means that do-files 1998.do ~ 2007.do have already been 
    * runned.
    *
    * Generate a id variable (id_in_source) for further combining data set
    * after match over years.
    * 
    * Only keep match variables and id_in_source for the next steps
    *****************************************************************************
    
    forvalues i = 1998/2007{
    	disp "File `i'"
    	use `"../original_`i'.dta"',clear
    *	gen id_in_source = _n
    	if `i'==2003{
    		gen town = address
    	}
    	gen cic = cic_adj
    	replace cic = real(industry_code) if cic == .
    	/*
    	if year <2003{
    		gen cic = cic_adj
    	}
    	else{
    		gen cic = cic03
    	}
    	*/
    
    	if year<2004{
    		gen revenue = sales_revenue
    	}
    	else{
    		gen revenue = operating_revenue
    	}
    	gen profit = total_profit
    	if year ==1999 | year == 2002{
    		gen employment = staff
    	}
    	keep id_in_source firm_id firm_name legal_person town province ///
    	     telephone zip product1 founding_year cic region_code revenue ///
    		 employment profit
    	destring founding_year revenue employment profit,replace force
    	tostring cic,replace format(%04.0f)
    	rename firm_id id
    	rename firm_name name
    	rename founding_year bdat
    	rename region_code dq
    	rename product1 product1_
    	rename telephone phone
    	foreach var of varlist *{
    		rename `var' `var'`i'
    	}
    	compress
    	saveold m`i'.dta,replace
    }
    

    第二部分,跨期匹配样本。

    步骤1. 匹配连续两年的数据(1998-1999;1999-2000;...)

    1.把id中的小写字母全部转换为大写。
    forval i =1998/2007{
    	use m`i'.dta,clear
    	replace id`i' = strupper(id`i')
    	compress
    	saveold m`i'.10.dta,replace
    }
    forval i =1998/2007{
    	use m`i'.10.dta,clear
    	des,short
    }

    2.使用循环,匹配连续两年之间的数据。loca i 代表当年年份,local j=i+1 代表未来一年。

      Step 10.  根据法人代码 firm_id 匹配。

    	*deal with duplicates of IDs (There are a few firms that have same IDs)
    	disp "Step 10 "
    	use m`i'.10.dta,clear
    	bysort id`i': keep if _N>1
    	compress
    	saveold duplicates_ID`i'.dta,replace
    	
    	use m`i'.10.dta,clear
    	bysort id`i': drop if _N>1
    	rename id`i' id
    	sort id
    	keep *`i' id
    	compress
    	saveold match`i'.1.dta,replace
    	
    	use m`j'.10.dta,clear
    	bysort id`j': keep if _N>1
    	compress
    	saveold duplicates_ID`j'.dta,replace
    	
    	use m`j'.10.dta,clear
    	bysort id`j': drop if _N>1
    	rename id`j' id
    	keep *`j' id
    	sort id
    	compress
    	saveold match`j'.1.dta,replace
    	
    	use match`i'.1.dta,clear
    	merge 1:1 id using match`j'.1.dta
    	keep if _m==3
    	gen id`i' = id
    	rename id id`j'
    	drop _merge
    	gen match_method_`i'_`j'="ID"
    	gen match_status_`i'_`j'="3"
    	compress
    	saveold matched_by_ID`i'_`j'.dta,replace
    	

      匹配后生成三类文件:

    duplicates_ID`i'.dta; duplicates_ID`j'.dta - 同一年内,多个企业共用同一id的企业文件;

    match`i'.1.dta; match`j'.1.dta - 不存在多个企业共用同一id的企业文件,用于 连续两年之间的merge

    matched_by_ID`i'_`j'.dta - match`i'.1.dta和 match`j'.1.dta merge之后 _m == 3 即利用id匹配成功的记录;

         *另外 step10之后可以注意到没有匹配成功的记录并不包括在上述三类文件中,在后续合并步骤中这些记录还会被重新匹配。

    Step20 利用 firmname 继续匹配Step10中未匹配的记录。

    	**step20: match by firm names**
    	
    	*match those unmatched firms in previous step by firm names*
    	disp "Step 20 "	
    	use match`i'.1.dta,clear
    	merge 1:1 id using match`j'.1.dta
    	keep if _m==1
    	rename id id`i'
    	append using duplicates_ID`i'.dta
    	bysort name`i': keep if _N>1
    	keep *`i'
    	compress
    	saveold duplicates_name`i'.dta,replace
    	
    	use match`i'.1.dta,clear
    	merge 1:1 id using match`j'.1.dta
    	keep if _m==1
    	rename id id`i'
    	append using duplicates_ID`i'.dta
    	bysort name`i': drop if _N>1
    	rename name`i' name
    	sort name
    	keep *`i' name
    	compress
    	saveold unmatched_by_ID`i'.dta,replace
    	
    	use match`i'.1.dta,clear
    	merge 1:1 id using match`j'.1.dta
    	keep if _m==2
    	rename id id`j'
    	append using duplicates_ID`j'.dta
    	bysort name`j': keep if _N>1
    	keep *`j'
    	compress
    	saveold duplicates_name`j'.dta,replace	
    
    	use match`i'.1.dta,clear
    	merge 1:1 id using match`j'.1.dta
    	keep if _m==2
    	rename id id`j'
    	append using duplicates_ID`j'.dta
    	bysort name`j': drop if _N>1
    	rename name`j' name
    	sort name
    	keep *`j' name
    	compress
    	saveold unmatched_by_ID`j'.dta,replace
    	
    	use unmatched_by_ID`i'.dta,clear
    	merge 1:1 name using unmatched_by_ID`j'.dta
    	keep if _m==3
    	gen name`i' = name
    	rename name name`j'
    	drop _m
    	gen match_method_`i'_`j'="firm name"
    	gen match_status_`i'_`j'="3"
    	compress
    	saveold matched_by_name`i'_`j'.dta,replace
    

    匹配之后生成三类文件

    duplicates_name`i'.dta - Step10中合并失败_m==1的文件+duplicates_ID`i'.dta中的文件 append在一起之后,存在多个企业共享“企业名称”字段的记录。

    duplicates_name`j'.dta - Step10中合并失败_m==2的文件+duplicates_ID`j'.dta中的文件 append在一起之后,存在多个企业共享“企业名称”字段的记录。

    unmatched_by_ID`i'.dta - Step10中合并失败_m==1且不存在共享“企业名称”字段的记录,用于按照firm_name merge.

    unmatched_by_ID`i'.dta - Step10中合并失败_m==2且不存在共享“企业名称”字段的记录,用于按照firm_name merge.

    matched_by_name`i'_`j'.dta unmatched_by_ID`i'.dta 和 unmatched_by_ID`j'.dta merge 之后匹配成功的记录,即按照firm_name匹配成功。

     *另外 step10之后可以注意到没有匹配成功的记录并不包括在上述三类文件中,也就是既不能按照id也不能按照name匹配成功的记录,在后续合并步骤中这些记录还会被重新匹配。


    Step30 利用 法人 legal person 继续匹配Step10中未匹配的记录。

    思路与Step10一致,同样生成了三类文件。

    	disp "Step 30 "
    	use unmatched_by_ID`i'.dta,clear
    	merge 1:1 name using unmatched_by_ID`j'.dta
    	keep if _m == 1
    	rename name name`i'
    	append using duplicates_name`i'.dta
    	replace legal_person`i' = "." if legal_person`i' == ""
    	gen code1 = legal_person`i' + substr(dq`i',1,4)
    	bysort code1: keep if _N>1
    	keep *`i' 
    	compress
    	saveold duplicates_code1_`i'.dta,replace
    	
    	use unmatched_by_ID`i'.dta,clear
    	merge 1:1 name using unmatched_by_ID`j'.dta
    	keep if _m == 1
    	rename name name`i'
    	append using duplicates_name`i'.dta
    	replace legal_person`i' = "." if legal_person`i' == ""
    	gen code1 = legal_person`i' + substr(dq`i',1,4)
    	bysort code1: drop if _N>1
    	sort code1
    	keep code1 *`i'
    	compress
    	saveold unmatched_by_ID_and_name`i'.dta,replace
    	
    	use unmatched_by_ID`i'.dta,clear
    	merge 1:1 name using unmatched_by_ID`j'.dta
    	keep if _m == 2
    	rename name name`j'
    	append using duplicates_name`j'.dta
    *	replace legal_person`j' = "." if legal_person`j' == ""
    	gen code1 = legal_person`j' + substr(dq`j',1,4)
    	bysort code1: keep if _N>1
    	keep *`j' 
    	compress
    	saveold duplicates_code1_`j'.dta,replace	
    	
    	use unmatched_by_ID`i'.dta,clear
    	merge 1:1 name using unmatched_by_ID`j'.dta
    	keep if _m == 2
    	rename name name`j'
    	append using duplicates_name`j'.dta
    *	replace legal_person`j' = "." if legal_person`j' == ""
    	gen code1 = legal_person`j' + substr(dq`j',1,4)
    	bysort code1: drop if _N>1
    	sort code1
    	keep code1 *`j'
    	compress
    	saveold unmatched_by_ID_and_name`j'.dta,replace
    	
    	use unmatched_by_ID_and_name`i'.dta,clear
    	disp _N
    	merge 1:1 code1 using unmatched_by_ID_and_name`j'.dta
    	keep if _m==3
    	drop _m code1
    	gen match_method_`i'_`j' = "legal_person"
    	gen match_status_`i'_`j' = "3"
    	compress
    	saveold matched_by_legalperson`i'_`j'.dta,replace
    	


    此后,还继续使用了phone number 、foudingyear等信息,经过 Step40 Step50 Step60进一步匹配了信息。得到了如下几个文件:
    matched_by_name`i'_`j'.dta
    matched_by_legalperson`i'_`j'.dta
    matched_by_phone`i'_`j'.dta
    matched_by_code3_`i'_`j'.dta
    unmatched_by_ID_and_name_and_legalperson_and_phone_and_code2`i'.dta
    unmatched_by_ID_and_name_and_legalperson_and_phone_and_code2`j'.dta

    将这六个文件合并,就得到了所有连续两年匹配后的样本

    	disp "Step 60 "	
    	use matched_by_ID`i'_`j'.dta,clear
    	append using matched_by_name`i'_`j'.dta
    	append using matched_by_legalperson`i'_`j'.dta
    	append using matched_by_phone`i'_`j'.dta
    	append using matched_by_code3_`i'_`j'.dta
    	append using unmatched_by_ID_and_name_and_legalperson_and_phone_and_code2`i'.dta
    	append using unmatched_by_ID_and_name_and_legalperson_and_phone_and_code2`j'.dta	
    	compress
    	saveold m`i'-m`j'.dta,replace	
    
    


    匹配后的效果以m1998-m1999.dta为例:

    这里只用开头的文件作为检查是不合适的,应该同时使用m2006-m2007.dta作为检查。


    对比 Brandet(2012)中每年记录数目的表格:



    可以验证合并过程没有问题,根据图1,1998年-1999年匹配的有140653条,未匹配成功1998年的共有24465条,相加刚好是165118条;其他年份的数据经检验后也是如此。至此,连续两年的跨期合并执行结束。



    步骤2. 匹配连续三年的数据(1998-1999-2000;1999-2000-2001;...)

    Step 70. 生成连续三年的平衡面板,并生成用于后续继续匹配的未匹配数据。年份用loca i, j, k 表示先后的连续三年。

    	**Step 70: Create a three-year balanced sample
    	disp "Step 70 "	
    	use m`i'-m`j'.dta,clear
    	keep if match_status_`i'_`j' == "1"
    	keep *`i'
    	compress
    	saveold unmatched`i'.10.dta,replace
    
    	use m`i'-m`j'.dta,clear
    	drop if match_status_`i'_`j' == "1"
    	gen code = id`j'+string(revenue`j')+string(employment`j')+string(profit`j')+province`j'
    	sort code
    	compress
    	saveold m`i'-m`j'.10.dta,replace
    	
    	use m`j'-m`k'.dta,clear
    	keep if match_status_`j'_`k' == "2"
    	keep *`k'
    	compress
    	saveold unmatched`k'.10.dta,replace
    
    	use m`j'-m`k'.dta,clear
    	drop if match_status_`j'_`k' == "2"
    	gen code = id`j'+string(revenue`j')+string(employment`j')+string(profit`j')+province`j'
    	sort code
    	compress
    	saveold m`j'-m`k'.10.dta,replace
    
    	use m`i'-m`j'.10.dta,clear
    	merge 1:1 code using m`j'-m`k'.10.dta
    	drop _m code
    	keep if match_status_`i'_`j'=="3" & match_status_`j'_`k'=="3"
    	gen match_status_`i'_`k'="3"
    	gen match_method_`i'_`k'="`j'"
    	compress
    	saveold balanced.m`i'-m`j'-m`k'.dta,replace
    

    执行之后生成了如下几类文件

    unmatched`i'.10.dta - 来自于 m`i'-m`j'.dta 中,未成功匹配且仅在year i 中的记录。

    m`i'-m`j'.10.dta - 来自于 m`i'-m`j'.dta中,包括成功匹配的和仅在year j中的记录。

    unmatched`k'.10.dta - 来自于m`j'-m`k'.dta中,未成功匹配且仅在year k中的记录

    m`j'-m`k'.10.dta - 来自于m`j'-m`k'.dta中,包括成功匹配和仅在year j中的记录

    balanced.m`i'-m`j'-m`k'.dta - m`i'-m`j'.10.dta和m`j'-m`k'.10.dta merge之后,两边都match的记录,即连续三年均出现的记录。


    Step 80. 生成未成功匹配的文件,用于后续的匹配。

    Step 70 生成了连续三年的平衡面板数据,但还有部分记录未能match起来,这一部分就是提取出这部分数据以便用于进一步的匹配。

    	**Step 80: Creat files for unmatched `i' firms and `k' firms**
    
    	disp "Step 80"
    	use m`i'-m`j'.10.dta,clear
    	merge 1:1 code using m`j'-m`k'.10.dta
    	drop _m code
    	drop if match_status_`i'_`j'=="3" & match_status_`j'_`k'=="3"
    	drop if id`i'==""
    	gen code = id`i'+string(revenue`i')+string(employment`i')+string(profit`i')+province`i'
    	sort code
    	compress
    	saveold unmatched`i'.15.dta,replace
    	
    	use unmatched`i'.15.dta,clear
    	keep *`i' 
    	append using unmatched`i'.10.dta
    	compress
    	saveold unmatched`i'.20.dta,replace
    	
    	
    	use m`i'-m`j'.10.dta,clear
    	merge 1:1 code using m`j'-m`k'.10.dta
    	drop _m code
    	drop if match_status_`i'_`j'=="3" & match_status_`j'_`k'=="3"
    	drop if id`k'== ""
    	gen code = id`k'+string(revenue`k')+string(employment`k')+string(profit`k')+province`k'
    	sort code
    	compress
    	saveold unmatched`k'.15.dta,replace
    	
    	use unmatched`k'.15.dta,clear
    	keep *`k' 
    	append using unmatched`k'.10.dta
    	compress
    	saveold unmatched`k'.20.dta,replace
    	
    	
    	use m`i'-m`j'.10.dta,clear
    	merge 1:1 code using m`j'-m`k'.10.dta
    	drop _m code
    	drop if match_status_`i'_`j'=="3" & match_status_`j'_`k'=="3"
    	gen code = id`j'+string(revenue`j')+string(employment`j')+string(profit`j')+province`j'
    	sort code
    	compress
    	saveold unmatched`j'.15.dta,replace
    


    生成的各个文件的含义

    unmatched`i'.15.dta - m`i'-m`j'.10.dta和m`j'-m`k'.10.dta merge之后不在平衡面板中且仅仅来自于year i的记录。

    unmatched`i'.20.dta - unmatched`i'.15.dta 与 unmatched`i'.10.dta append起来的记录,其中 10.dta 是由Step70生成,表示 m`i'-m`j'.dta 中仅仅来自于year i 的记录。二者合并之后得到的就是目前为止所有来自于i的未能匹配的记录。

    unmatched`k'.15.dta - 同unmatched`i'.15.dta

    unmatched`k'.20.dta - 同unmatched`i'.20.dta

    unmatched`j'.15.dta -  m`i'-m`j'.10.dta和m`j'-m`k'.10.dta merge之后 不在平衡面板中所有记录(与 以i, k为下表的同类文件相比,由于这次merge肯定是完全merge,因此所有都是“无法按照j进行match的记录”,但显然这样存在一定的重叠。后续在合并的时候会对这里的重叠部分进行处理





    Step90 对Step80中得到的未匹配数据(即不在三年平衡面板中的记录:ummatched`i'.20.dta,unmatched`k'.20.dta)进行再一次匹配,运用 firm_id 和firm_name 进行匹配。

    匹配思路与构建两年平衡面板时对应的处理思路是完全一样的:先确定有否duplicates的现象,区分后分别merge

    	**Step 90: Match `i' firms and `k' firms by firm ID and name**
    	
    	
    	*ID*
    	disp "Step 90"
    	use unmatched`i'.20.dta,clear
    	bysort id`i': keep if _N>1
    	compress
    	saveold duplicates_ID`i'.dta,replace
    	
    	use unmatched`i'.20.dta,clear
    	bysort id`i': drop if _N>1
    	rename id`i' id
    	keep *`i' id
    	sort id
    	compress
    	saveold match`i'.1.dta,replace
    	
    	use unmatched`k'.20.dta,clear
    	bysort id`k': keep if _N>1
    	compress
    	saveold duplicates_ID`k'.dta,replace
    		
    	use unmatched`k'.20.dta,clear
    	bysort id`k': drop if _N>1
    	rename id`k' id
    	keep *`k' id
    	sort id
    	compress
    	saveold match`k'.1.dta,replace
    	
    	use match`i'.1.dta,clear
    	merge 1:1 id using match`k'.1.dta
    	keep if _m==3
    	gen id`i'=id
    	rename id id`k'
    	drop _m
    	gen match_method_`i'_`k'="`j'"
    	gen match_status_`i'_`k'="3"
    	compress
    	saveold matched_by_ID`i'_`k'.dta,replace
    	
    	
    	
    	*name*
    	
    	use match`i'.1.dta, clear
    	merge 1:1 id using match`k'.1.dta
    	keep if _merge==1
    	rename id id`i'
    	append using duplicates_ID`i'.dta
    	bysort name`i': keep if _N>1
    	keep *`i'
    	compress
    	saveold duplicates_name`i'.dta, replace
    	
    	use match`i'.1.dta, clear
    	merge 1:1 id using match`k'.1.dta
    	keep if _merge==1
    	rename id id`i'
    	append using duplicates_ID`i'.dta
    	bysort name`i': drop if _N>1
    	rename name`i' name
    	sort name
    	keep name *`i'
    	compress
    	saveold unmatched_by_ID`i'.dta, replace
    
    	use match`i'.1.dta, clear
    	merge 1:1 id using match`k'.1.dta
    	keep if _merge==2
    	rename id id`k'
    	append using duplicates_ID`k'.dta
    	bysort name`k': keep if _N>1
    	keep *`k'
    	compress
    	saveold duplicates_name`k'.dta, replace
    
    	use match`i'.1.dta, clear
    	merge 1:1 id using match`k'.1.dta
    	keep if _merge==2
    	rename id id`k'
    	append using duplicates_ID`k'.dta
    	bysort name`k': drop if _N>1
    	rename name`k' name
    	sort name
    	keep name *`k'
    	compress
    	saveold unmatched_by_ID`k'.dta, replace
    	
    	use unmatched_by_ID`i'.dta, clear
    	merge 1:1 name using unmatched_by_ID`k'.dta
    	keep if _merge==3
    	gen name`i'=name
    	rename name name`k'
    	drop _merge
    	gen match_method_`i'_`k'="firm name"
    	gen match_status_`i'_`k'="3"
    	compress
    	saveold matched_by_name`i'_`k'.dta, replace
    	
    
    	use unmatched_by_ID`i'.dta, clear
    	merge 1:1 name using unmatched_by_ID`k'.dta
    	keep if _merge==1
    	rename name name`i'
    	keep *`i'
    	append using duplicates_name`i'.dta
    	gen match_method_`i'_`k'=""
    	gen match_status_`i'_`k'="1"
    	compress
    	saveold unmatched_by_ID_and_name_`i'.dta, replace	
    	
    	
    	use unmatched_by_ID`i'.dta, clear
    	merge 1:1 name using unmatched_by_ID`k'.dta
    	keep if _merge==2
    	rename name name`k'
    	keep *`k'
    	append using duplicates_name`k'.dta
    	gen match_method_`i'_`k'=""
    	gen match_status_`i'_`k'="2"
    	compress
    	saveold unmatched_by_ID_and_name_`k'.dta, replace


    执行之后得到了如下几个文件:

    matched_by_ID`i'_`k'.dta, clear
    matched_by_name`i'_`k'.dta
    unmatched_by_ID_and_name_`i'.dta
    unmatched_by_ID_and_name_`k'.dta

    文件含义从名字上就已经很清楚。



    Step 100 合并所有文件,处理冲突问题,生成连续三年的非平衡面板

    	**step 100: merge the files**
    	disp "Step 100"
    	use matched_by_ID`i'_`k'.dta, clear
    	append using matched_by_name`i'_`k'.dta
    	append using unmatched_by_ID_and_name_`i'.dta
    	append using unmatched_by_ID_and_name_`k'.dta
    	compress
    	saveold m`i'-m`k'.dta, replace
    	
    	use m`i'-m`k'.dta, clear
    	gen code = id`i'+string(revenue`i')+string(employment`i')+string(profit`i')+province`i'
    	sort code
    	*drop if code == "..."
    	merge code using unmatched`i'.15.dta
    	drop code _merge
    	sort id`i'
    	compress
    	compress
    	saveold m`i'-m`k'.05.dta, replace
    		
    	*deal with disagreement (_merge==5 if "update" is used)*
    
    	use m`i'-m`k'.05.dta, clear
    	gen code = id`k'+string(revenue`k')+string(employment`k')+string(profit`k')+province`k'
    	sort code
    	
    	merge code using unmatched`k'.15.dta, update
    	keep if _merge==5
    	drop *`k'
    	drop code _merge 
    	sort id`i'
    	compress
    	compress
    	saveold m`i'-m`k'.disagree.dta, replace
    
    
    	use m`i'-m`k'.05.dta, clear
    	merge id`i' using m`i'-m`k'.disagree.dta
    	drop if _merge==3
    	drop _merge
    	append using m`i'-m`k'.disagree.dta
    	
    	gen code = id`k'+string(revenue`k')+string(employment`k')+string(profit`k')+province`k'
    	sort code
    	merge code using unmatched`k'.15.dta, update
    	drop code _merge 
    	gen code = id`j'+string(revenue`j')+string(employment`j')+string(profit`j')+province`j'
    	sort code
    	merge code using unmatched`j'.15.dta, update
    	drop code _merge
    	compress
    	saveold m`i'-m`k'.dta.10.dta, replace
    	
    
    	use m`i'-m`k'.dta.10.dta, clear
    	append using balanced.m`i'-m`j'-m`k'.dta
    	drop match_status_`i'_`j'
    	drop match_status_`j'_`k'
    	drop match_status_`i'_`k'
    	drop match_method_`i'_`j'
    	drop match_method_`j'_`k'
    	drop match_method_`i'_`k'
    	gen match_status_`i'_`j'_`k'="`i'-`j'-`k'" if id`i'!=""&id`j'!=""&id`k'!=""
    	replace match_status_`i'_`j'_`k'="`i'-`j' only" if id`i'!=""&id`j'!=""&id`k'==""
    	replace match_status_`i'_`j'_`k'="`j'-`k' only" if id`i'==""&id`j'!=""&id`k'!=""
    	replace match_status_`i'_`j'_`k'="`i'-`k' only" if id`i'!=""&id`j'==""&id`k'!=""
    	replace match_status_`i'_`j'_`k'="`i' no match" if id`i'!=""&id`j'==""&id`k'==""
    	replace match_status_`i'_`j'_`k'="`j' no match" if id`i'==""&id`j'!=""&id`k'==""
    	replace match_status_`i'_`j'_`k'="`k' no match" if id`i'==""&id`j'==""&id`k'!=""
    	compress
    	saveold unbalanced.`i'-`j'-`k'.dta, replace



    执行完了之后 以unbalanced.1998-1999-2000.dta,检查匹配状况:



    可以验证合并过程没有问题


    *最初只用了unbalanced.1998-1999-2000.dta作为检查对象,没有用unbalanced.2005-2006-2007.dta 同时做检查,导致有一个小错误没有发现,所有检查应注意至少检测所有的情况。




    第三部分,生成10年的非平衡面板。

    首先,将1998-1999-2000的非平衡面板保存为test1.dta

    use unbalanced.1998-1999-2000.dta, clear
    tab match_status_1998_1999_2000
    gen code=id2000+string(revenue2000)+string(employment2000)+string(profit2000)
    sort code
    save test1.dta, replace
    

    Step 110. 将2011年的数据合并进来

    **step 110: add 2001 from 1999-2000-2001**
    
    use unbalanced.1999-2000-2001.dta, clear
    tab match_status_1999_2000_2001
    keep if match_status_1999_2000_2001=="1999-2000-2001"|match_status_1999_2000_2001=="2000-2001 only"
    gen code=id2000+string(revenue2000)+string(employment2000)+string(profit2000)
    sort code
    save test2.dta, replace
    
    use test1.dta, clear
    merge code using test2.dta
    tab _merge
    drop _merge code
    gen code=id1999+string(revenue1999)+string(employment1999)+string(profit1999)
    sort code
    save test3.dta, replace
    
    use unbalanced.1999-2000-2001.dta, clear
    tab match_status_1999_2000_2001
    keep if match_status_1999_2000_2001=="1999-2001 only"
    gen code=id1999+string(revenue1999)+string(employment1999)+string(profit1999)
    sort code
    save test4.dta, replace
    
    use test3.dta, clear
    merge code using test4.dta, update
    tab _merge
    drop code _merge
    save test5.dta, replace
    
    use test3.dta, clear
    merge code using test4.dta, update replace
    keep if _merge==5
    keep id2001	bdat2001 cic2001 dq2001 e_HMT2001 e_collective2001 e_foreign2001 e_individual2001 e_legal_person2001 e_state2001 employment2001 export2001	fa_net2001 fa_original2001 a_dep2001 c_dep2001 input2001	name2001 new_product2001 output2001 profit2001 revenue2001 type2001 va2001 wage2001 legal_person2001 phone2001 product1_2001 street2001 town2001 village2001 zip2001       
    save test6.dta, replace
    
    use unbalanced.1999-2000-2001.dta, clear
    keep if match_status_1999_2000_2001=="2001 no match"
    display _N
    save test7.dta, replace
    
    use test5.dta, clear
    append using test6.dta
    dis _N
    append using test7.dta
    dis _N
    gen code=id2001+string(revenue2001)+string(employment2001)+string(profit2001)
    sort code
    save test1.dta, replace

    思路如下:

    从 1999-2000-2001中挑选出 以2000年为合并基准的记录,保存为test2.dta

    将test1.dta和test2.dta 依据 code2000 merge起来,存为test3

    从 1999-2000-2001中挑选出 以1999年为合并基准的记录,保存为test4.dta

    将test3.dta和test4.dta依据code1999 merge起来,存为test5.

    将test3.dta和test4.dta依据code1999 merge起来,取值存在冲突的记录,存为test6. test3.dta和test4.dta中公共的部分是var2000-var2002。如果merge的时候这部分公共变量有不同,说明不是同一条,应作为两条数据处理。

    将2001年未能匹配的记录存为test7.dta

    append test5.dta, test6.dta, test7.dta。



    随后,通过Step120将2002将2002合并进来,。。。,直到顺次将2007也合并进来,就得到了这样一个非平衡面板。




    最后,通过下面的代码,得到面板和原始数据的对应关系

    use "unbalanced.1998--2007.dta",clear
    keep id_in_source*
    gen id_in_panel=_n
    reshape long id_in_source, i(id_in_panel) j(year)
    drop if id_in_source == .
    sort id_in_panel year
    saveold "PanelID_1998-2007.dta",replace


    转换后检查每一年的样本数量:



    *由于数据库来源的问题,我使用的数据与Brandt(2012)的数据在某些年份上存在一定的误差。(主要是2004年,所用的数据来自于全国经济普查,这同时也导致了很多关键指标的缺失等问题)



    至此,匹配程序处理完毕,完整版程序见另一篇博文: 工业企业数据库处理代码完整版本——2.匹配样本 。

    展开全文
  • MySQL数据库面试题(2020最新版)

    万次阅读 多人点赞 2020-03-10 17:20:40
    文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储...
  • 十大企业数据库

    千次阅读 2010-06-14 09:48:25
    企业数据库市场,诸如热备份和高可用等先进技术已经成为各大数据库竞争的焦点,这些数据库既有免费的开源数据库,也有许可费高达数千美元的商业数据库,截至目前为止,市场上出现了形形×××的数据库,但没有...
  • 在线答题程序数据库设计

    千次阅读 2020-07-03 15:52:38
    最近有不少朋友咨询我在线答题程序的数据库集合设计,现专门写文整理下,该程序目前包含以下十个集合 数据库设计 admin 该集合主要用于指定管理员openid,对于部分openid开放创建试卷以及数据报表导入、...
  • Mac OS系统如何安装Oracle11g企业数据库

    千次阅读 多人点赞 2019-08-28 08:51:16
    Oracle从10的企业级版本开始就不在对Mac进行相关技术支持和运维服务,所以导致很多使用Mac的程序员无法进行相关工作的开展,不得不在自己的Mac安装Win系列的虚拟机,然后在Win虚拟机再安装Oracle数据库,...
  • 由于作者一直使用SQL Server 2008 R2开发版,之前在ArcGIS创建企业数据库都是基于单独安装的SQL Server 2008 R2开发版,今天我们演示安装ArcGIS10.6自带的数据库服务(SQL Server 2014 Express版本)、连接...
  • 可以使用创建企业级地理数据库地理处理工具或Python 脚本在Microsoft SQL Server 或PostgreSQL 数据库管理系统创建数据库、地理数据库管理员和企业级地理数据库。还可以使用此工具在Oracle 数据库中创建默认表空间...
  • Sqlite3结(小型数据库中增删改查的操作)

    万次阅读 多人点赞 2018-11-22 16:31:32
    说一点:学习的话还是要用印象笔记~没有为什么~:数据库浅学 一、数据库简介 1、数据库简介  数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。  在信息化社会,充分有效地管理和利用各类信息...
  • 项目中数据库设计

    千次阅读 2015-04-10 13:05:48
    在这次同学的面试过程有设计到了,于是再次翻出来以前考过的课本把整本书数据库设计留了一遍有了一些新的发现。分享给大家: 首先数据库设计分成四个大部分: 定义数据结构 数据装载 编制调试 试运行...
  • 数据库学习】数据库总结

    万次阅读 多人点赞 2018-07-26 13:26:41
    1,数据库 1)概念 数据库是长期存储在计算机内、有组织的、可共享的大量数据的集合。 常见数据库管理系统有:Access、mysql、sql server 2)特点 ①数据库数据特点 永久存储、有组织...
  • 一、数据库 1、数据库,通常是一个戒一组文件,保存了一些符合特定规格的数据,数据库对应的英询单词是DataBase,简称DB;数据库软件称为数据库管理系统,英文简称DBMS,全称为DataBase Management System,例如:...
  • 实时数据库与时序数据库

    千次阅读 多人点赞 2020-11-18 10:40:39
    在工业大数据数据库存储领域,除了传统的关系型数据库和分布式数据库以外,还有一种类型的数据库是非常常用,而且是非常有必要的,就是实时数据库,以及时序数据库。 但是,大家可能会有疑问,都是专门处理时序数据...
  • 如何在Linux系统安装Oracle数据库

    千次阅读 2019-07-28 07:43:06
    本文主要介绍了如何在Linux系统快速安装Oracle数据库,包括前期的准备工作,Oracle数据库软件的安装、数据库的安装等内容。 硬件简介 系统:Oracle Linux 6.4 内核:2.6.39-400.17.1.el6uek.x86_64 内存:3GB ...
  • 企业级 MySQL数据库的搭建及管理

    千次阅读 2018-11-29 19:16:27
    数据库简介 数据库(英文Dtabase)就是一个存放数据的仓库,这个仓库是按照一定的数据结果...而在当今的互联网,最常用的数据库模型主要是两种,即关系型数据库和非关系型数据库。 (一)关系型数据库 关系型数...
  • 查询时序数据库中的数据

    千次阅读 2017-07-17 21:00:31
    查询时序数据库中的数据上一篇,我们实际上传了50,000个数据点。本文,我们了解如何查询时序数据库中海量的数据。查询数据的使用场景时序数据库主要的使用场景就是管理机器运行的实时数据和其他场景的时序数据。而...
  • 数据库

    千次阅读 2019-02-23 17:44:47
    数据库是部署和虚拟化在云计算环境数据库。云数据库是在云计算的大背景下发展起来的一种新兴的共享基础架构的方法,它极大地增强了数据库的存储能力,消除了人员、硬件、软件的重复配置,让软、硬件升级变得...
  • 查看mysql日志文件大小和数据库大小

    千次阅读 2016-09-12 10:33:00
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • DB2数据库

    千次阅读 2017-03-31 21:57:26
    转自:DB2数据库 ...DB2是IBM一种分布式数据库...它支持多用户或应用程序在同一条SQL 语句查询不同database甚至不同DBMS的数据。目前,DB2有如下一些版本:(比如DB2 for Unix,DB2 for Windows,DB2 for AS/4
  • Vue + Spring Boot 项目实战(四):数据库的引入

    万次阅读 多人点赞 2019-04-14 12:20:35
    在项目引入数据库,实现通过数据库验证用户名与密码。
  • 数据库引擎

    千次阅读 2016-07-16 11:18:53
    利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。  数据库应用项目是通过数据库引擎与数据库链接的。何为数据库引擎呢?简而言之,数据库引擎就是驱动各种...
  • 运维的MySQL数据库管理方式

    千次阅读 2019-02-27 01:05:19
    在关系型数据库中,对数据的操作几乎全部建立在一个或多个关系表格上,通过对这些关联的表格分类、合并、连接或选取等运算来实现数据库的管理。 典型产品:Mysql、Oracle、DB2、Sqlserver 1.IBM的DB2  DB2是IBM...
  • 此方案,以管理视角来看,是以构建区域性中小企业生态链为己任的模式,形成适合的社会化服务效应;以技术视角老看,基于大数据、云计算多租户PaaS搭建中小企业运营服务平台。
  • MySQL数据库

    千次阅读 2019-11-22 17:34:58
    数据库作为程序数据的主要载体,在整个项目扮演着重要的角色。PHP自身可以与大多数数据库进行连接,但MySQL数据库树开源界所公认的与PHP结合最好的数据库,它具有安全、跨平台、体积和高效等特点,可谓PHP的...
  • 衡量企业应用数据库性能的6大指标

    千次阅读 2016-01-26 18:00:04
    【编者按】本文作者是 Omed Habib,在其职业生涯花费了大量的时间不断探索一些新...本文基于这些主题,通过回顾最重要的六个性能指标,帮助评估企业应用数据库的健康状况。具体来说,本文包括以下内容: 事务 查...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 314,234
精华内容 125,693
关键字:

中小企业数据库