四、DWS层构建 制造业务维度设计

191 阅读10分钟

维度设计

  • 功能:基于组合维度来更加细化我们的指标,来更加精确的发现问题

    • 指标如果不基于组合维度进行分析得到,指标的结果是没有意义的
  • 实现:开发中维度就是指标聚合时的分组字段

  • 特点

    • 数据量小
    • 很少发生变化
  • 采集方式:全量

  • 常见维度

    • 时间维度:年、季度、月、周、天、小时
    • 地区维度:国家、省份、城市
    • 平台维度:网站、APP、小程序、H5
    • 操作系统维度:Windows、Mac OS、Android、Linux、IOS
    • ……

维度设计常用模型

  • 星型模型

    • 设计:所有维度表直接关联事实表
    • 优点:每次查询时候,直接获取对应的数据结果,不用关联其他的维度子表,可以提高性能
    • 缺点:数据冗余度相比雪花模型较高

image-20210507225442704.png

  • 星座模型

    • 星座模型:基于星型模型的演变,多个事实共同使用一个维度表

image-20210507225834413.png

一站制造业务维度设计

  • 日期时间维度(未实现)

    • 年维度、季度维度、月维度、周维度、日维度
    • 日环比、周环比、月环比、日同比、周同比、月同比
    • 环比:同一个周期内的比较
    • 同比:上个个周期的比较
  • 行政地区维度

    • 地区级别:国家维度、省份维度、城市维度、县区维度、乡镇维度
  • 服务网点维度

    • 网点名称、网点编号、省份、城市、县区、所属机构
  • 油站维度

    • 油站类型、油站名称、油站编号、客户编号、客户名称、省份、城市、县区、油站状态、所属公司
  • 组织机构维度

    • 人员编号、人员名称、岗位编号、岗位名称、部门编号、部门名称

行政地区维度设计

构建行政地区维度表,得到所有省份、城市、县区及乡镇维度信息

 --获取所有乡镇的所有信息
 select id area_id,areaname area,parentid from one_make_dwd.ciss_base_areas where rank = 4
 --获取所有县区的信息
 select id area_id,areaname area,parentid from one_make_dwd.ciss_base_areas where rank = 3
 --获取所有市区的所有信息
 select id area_id,areaname area,parentid from one_make_dwd.ciss_base_areas where rank = 2 
 --获取所有省份的信息
 select id area_id,areaname area,parentid from one_make_dwd.ciss_base_areas where rank = 1

实现SQL

 --获取每个镇的所有行政地区信息 area_id = parentid
 --省份id  省份名称    城市id    城市名称    县区id    县区名称    乡镇id    乡镇名称
 SELECT 
     -- 省ID、省名称  
     province.area_id as provinceId,province.area as provincename,
     -- 市区ID、市区名称    
     city.area_id as cityId,city.area as cityname,
     -- 县ID、县区名称 
     county.area_id as countyId,county.area as countyname,
     -- 镇ID、镇名称  
     town.area_id as townId,town.area as townname
 FROM 
     --获取所有乡镇的所有信息
     (select id area_id,areaname area,parentid from one_make_dwd.ciss_base_areas where rank = 4) AS  town
 JOIN 
     --获取所有县区的信息
     (select id area_id,areaname area,parentid from one_make_dwd.ciss_base_areas where rank = 3) AS  county
     ON town.parentid = county.area_id
 JOIN 
     --获取所有市区的所有信息
     (select id area_id,areaname area,parentid from one_make_dwd.ciss_base_areas where rank = 2) AS  city
     ON county.parentid = city.area_id
 JOIN 
     --获取所有省份的信息
     (select id area_id,areaname area,parentid from one_make_dwd.ciss_base_areas where rank = 1) AS  province
     ON city.parentid = province.area_id

服务网点维度设计

构建服务网点维度表,得到服务网点id、网点名称、网点所属的地理区域、服务网点状态等

image-20211003085815855.png

 --ciss_base_servicestation:服务网点信息表
 --id                              |name            |code  |province|city|region|status|org_id|org_name        |
 ----------------------------------+----------------+------+--------+----+------+------+------+----------------+
 --40284afa5bc4f47e015bc8760a7c0814|太原*****         |W14167|14      |1401|      |     1|1026  |太原*****         |
 --40284afa5ce73d1c015d0c8c81d16e7a|吉尔****          |W41242|41      |4101|410102|     1|1141  |吉尔*****         |
 select
     -- 服务网点ID、名称、编号
     id,name,code,
     -- 省份ID、缺省份名称
     province as province_ID,pro.province_name
     -- 城市ID、缺城市名称
     city as city_ID,city.city_name
     -- 所属县区ID、缺所属县区名称
     region as region_ID,region.region_name
     -- 使用状态编号(1 | 2)、使用状态名称
     status,b.dictname
     -- 部门ID,部门名称
     org_id,org_name
 from ONE_MAKE_DWD.ciss_base_servicestation;

eos_dict_type:字典状态类别表 与 eos_dict_entry:字典状态明细表 结合获取 状态编号状态名称

 --eos_dict_type:字典状态类别表,记录所有需要使用字典标记的表
 --字典类别表:字典类型id和字典类型名称
 --dicttypeid                 |dicttypename|
 -----------------------------+------------+
 --BUSS_SERVICE_STATION_STATUS|服务网点使用状态    |
 select dicttypeid,dicttypename from ONE_MAKE_DWD.eos_dict_type where dicttypename = '服务网点使用状态';
 ​
 ​
 --eos_dict_entry:字典状态明细表,记录所有具体的状态或者类别信息
 --字典明细表:字典类型id、具体的编号和值
 --dicttypeid                 |dictid|dictname|
 -----------------------------+------+--------+
 --BUSS_SERVICE_STATION_STATUS|2     |停用      |
 --BUSS_SERVICE_STATION_STATUS|1     |使用      |
 select dicttypeid,dictid,dictname from ONE_MAKE_DWD.eos_dict_entry where dicttypeid = 'BUSS_SERVICE_STATION_STATUS';
 ​
 ​
 ​
 --dicttypeid                 |dictid|dictname|
 -----------------------------+------+--------+
 --BUSS_SERVICE_STATION_STATUS|2     |停用      |
 --BUSS_SERVICE_STATION_STATUS|1     |使用      |
 SELECT 
     a.dicttypeid,dictid,dictname
 FROM 
     (select dicttypeid,dicttypename from ONE_MAKE_DWD.eos_dict_type where dicttypename = '服务网点使用状态') AS a
 JOIN 
     (select dicttypeid,dictid,dictname from ONE_MAKE_DWD.eos_dict_entry where dicttypeid = 'BUSS_SERVICE_STATION_STATUS') AS b
     ON a.dicttypeid = b.dicttypeid

ciss_base_areas:行政地区信息表

  • 通过具体的id关联所有地区信息(这里只选取了 省、市、县)
 --获取所有县区的信息
 select id area_id,areaname area from one_make_dwd.ciss_base_areas where rank = 3
 --获取所有市区的所有信息
 select id area_id,areaname area from one_make_dwd.ciss_base_areas where rank = 2 
 --获取所有省份的信息
 select id area_id,areaname area from one_make_dwd.ciss_base_areas where rank = 1

实现SQL

 /*
 id                              |name            |code  |province_ID|province_name|city_ID|city_name |region_ID|region_name|status|dictname|org_id|org_name        |
 --------------------------------+----------------+------+-----------+-------------+-------+----------+---------+-----------+------+--------+------+----------------+
 40284afa672b330d0169bd3277895aa0|蓟县***           |W12424|12         |天津市          |1202   |市辖县       |120225   |蓟县         |     1|使用      |1428  |蓟县***           |
 40284afa6aa022f4016ab92695615539|承德***           |W13501|13         |河北省          |1308   |承德市       |130802   |双桥区        |     1|使用      |1541  |承德***           |
 */
 select
     -- 服务网点ID、名称、编号
     id,name,code,
     -- 省份ID、缺省份名称
     province as province_ID,pro.province_name,
     -- 城市ID、缺城市名称
     city as city_ID,city.city_name,
     -- 所属县区ID、缺所属县区名称
     region as region_ID,region.region_name,
     -- 使用状态编号(1 | 2)、使用状态名称
     status,b.dictname,
     -- 部门ID,部门名称
     org_id,org_name
 from ONE_MAKE_DWD.ciss_base_servicestation AS a
 join 
     -- 添加 使用状态名称
     (
 --  dictid|dictname|
 --  ------+--------+
 --  2     |停用      |
 --  1     |使用      |
     SELECT 
         dictid,dictname
     FROM 
         (select dicttypeid,dicttypename from ONE_MAKE_DWD.eos_dict_type where dicttypename = '服务网点使用状态') AS a
     JOIN 
         (select dicttypeid,dictid,dictname from ONE_MAKE_DWD.eos_dict_entry where dicttypeid = 'BUSS_SERVICE_STATION_STATUS') AS b
         ON a.dicttypeid = b.dicttypeid) AS b
     ON a.status = b.dictid
 JOIN 
     -- 添加省份名称
     (select id province_id,areaname province_name from one_make_dwd.ciss_base_areas where rank = 1) AS pro
     ON a.province = pro.province_id
 JOIN 
     -- 添加城市名称
     (select id city_id,areaname city_name from one_make_dwd.ciss_base_areas where rank = 2) AS city
     ON a.city = city.city_id
 JOIN 
     -- 添加县区名称
     (select id region_id,areaname region_name from one_make_dwd.ciss_base_areas where rank = 3) AS region
     ON a.region = region.region_id

油站维度设计

构建油站维度表,得到油站id、油站名称、油站所属的地理区域、所属公司、油站状态等

image-20211003095335316.png

 /*
 id                              |name          |code    |customer_id|customer_name          |province_name|city_name|region_name|township_name|status|customer_classify|dt      |
 --------------------------------+--------------+--------+-----------+-----------------------+-------------+---------+-----------+-------------+------+-----------------+--------+
 10011414                        |中石****        |10011414|S0166      |中国*********            |22           |2203     |220301     |             |     1|0002             |20210101|
 10011415                        |中石*****       |10011415|S0166      |中国*********            |22           |2203     |220301     |             |     1|0002             |20210101|
 */
 SELECT
     -- 油站ID、油站名称、油站编码
     id, name, code,
     -- 客户ID、客户名称
     -- 缺客户所属公司ID、所属公司名称、客户所在省份id和省份名称
     customer_id, customer_name,
     -- 油站所属省份ID、城市ID、县区ID、乡镇ID
     -- 缺所属省份名称、城市名称、县区名称、乡镇名称
     province AS province_name, city AS city_name, region AS region_name, township AS township_name,
     -- 状态(停用、正常)
     -- 缺状态名称
     status, 
     -- 客户分类ID
     customer_classify, 
     -- 分区(按年月日)
     dt
 from one_make_dwd.ciss_base_oilstation
 where id != '' and name is not null and name != 'null' and customer_id is not null;

获取 油站状态

 --eos_dict_type:字典状态类别表,记录所有需要使用字典标记的表
 /*DICTTYPEID            |DICTTYPENAME|RANK|PARENTID|SEQNO                   |dt      |
 ----------------------+------------+----+--------+------------------------+--------+
 BUSS_OILSTATION_STATUS|油站状态        |   1|        |.BUSS_OILSTATION_STATUS.|20210101|*/
 select * from ONE_MAKE_DWD.eos_dict_type where dicttypename = '油站状态';
 ​
 ​
 ​
 --eos_dict_entry:字典状态明细表,记录所有具体的状态或者类别信息
 /*DICTTYPEID            |DICTID|DICTNAME|STATUS|SORTNO|RANK|PARENTID|SEQNO|FILTER1|FILTER2|dt      |
 ----------------------+------+--------+------+------+----+--------+-----+-------+-------+--------+
 BUSS_OILSTATION_STATUS|2     |停用      |     1|     2|   1|        |.2.  |       |       |20210101|
 BUSS_OILSTATION_STATUS|1     |正常      |     1|     1|   1|        |.1.  |       |       |20210101|*/
 select * from ONE_MAKE_DWD.eos_dict_entry where dicttypeid = 'BUSS_OILSTATION_STATUS';
 ​
 ​
 /*DICTID|DICTNAME|
 ------+--------+
 2     |停用      |
 1     |正常      |*/
 SELECT 
     DICTID,
     DICTNAME
 FROM 
     (select * from ONE_MAKE_DWD.eos_dict_type where dicttypename = '油站状态') AS a
 JOIN 
     (select * from ONE_MAKE_DWD.eos_dict_entry where dicttypeid = 'BUSS_OILSTATION_STATUS') AS b
     ON a.DICTTYPEID = b.DICTTYPEID;

获取 客户id、公司名称、客户所属省份、客户所属公司ID

 --ciss_base_baseinfo:客户公司信息表【公司ID、公司名称】
 --ygcode|companyname|
 --------+-----------+
 --17    |一站制造**     |
 --13    |一站制造**     |
 --11    |一站制造**     |
 select ygcode, companyname from one_make_dwd.ciss_base_baseinfo group by ygcode, companyname;
 ​
 ​
 --ciss_base_customer:客户信息表【客户id、客户省份名称、所属公司ID】
 --code |province|company|
 -------+--------+-------+
 --S0201|江苏省     |11     |
 --S0202|        |13     |
 select code, province, company from one_make_dwd.ciss_base_customer;
 ​
 ​
 /*companyname|code |province|company|
 -----------+-----+--------+-------+
 一站制造**     |S1684|浙江省     |17     |
 一站制造**     |S1684|浙江省     |17     |*/
 SELECT 
     code,           -- 客户id
     companyname,    -- 公司名称
     province,       -- 客户省份名称
     company         -- 所属公司ID
 FROM 
     (select ygcode, companyname from one_make_dwd.ciss_base_baseinfo group by ygcode, companyname) AS a
 JOIN 
     (select code, province, company from one_make_dwd.ciss_base_customer) AS b
     ON a.ygcode = b.company
     

实现SQL

 ​
 SELECT
     -- 油站ID、油站名称、油站编码
     id, name, cio.code,
     -- 客户ID、客户名称
     -- 缺客户所属公司ID、所属公司名称、客户所在省份id和省份名称
     customer_id, customer_name,
     customer.companyname,customer.company,customer.province,
     -- 油站所属省份ID、城市ID、县区ID、乡镇ID
     -- 缺所属省份名称、城市名称、县区名称、乡镇名称
     cio.province AS province_ID, city AS city_ID, region AS region_ID, township AS township_ID,
     province_name,city_name,region_name,township_name,
     -- 状态(停用、正常)
     -- 缺状态名称
     status, DICTNAME
     -- 客户分类ID
     customer_classify, 
     -- 分区(按年月日)
     dt
 from 
     one_make_dwd.ciss_base_oilstation  AS cio
 JOIN
     (SELECT 
         code,           -- 客户id
         companyname,    -- 公司名称
         province,       -- 客户省份名称
         company         -- 所属公司ID
     FROM 
         (select ygcode, companyname from one_make_dwd.ciss_base_baseinfo group by ygcode, companyname) AS a
     JOIN 
         (select code, province, company from one_make_dwd.ciss_base_customer) AS b
         ON a.ygcode = b.company) AS customer
     ON cio.customer_id = customer.code
 JOIN 
     -- 油站状态
     (SELECT 
         DICTID,
         DICTNAME
     FROM 
         (select * from ONE_MAKE_DWD.eos_dict_type where dicttypename = '油站状态') AS a
     JOIN 
         (select * from ONE_MAKE_DWD.eos_dict_entry where dicttypeid = 'BUSS_OILSTATION_STATUS') AS b
         ON a.DICTTYPEID = b.DICTTYPEID) AS status 
     ON cio.status = status.DICTID
 JOIN    
     --获取所有省份的信息
     (select id province_id,areaname province_name from one_make_dwd.ciss_base_areas where rank = 1) AS province 
     ON cio.province = province.province_id
 JOIN 
     -- 添加城市名称
     (select id city_id,areaname city_name from one_make_dwd.ciss_base_areas where rank = 2) AS city
     ON cio.city = city.city_id
 JOIN 
     -- 添加县区名称
     (select id region_id,areaname region_name from one_make_dwd.ciss_base_areas where rank = 3) AS region
     ON cio.region = region.region_id
 JOIN 
     -- 添加乡镇名称
     (select id township_id,areaname township_name from one_make_dwd.ciss_base_areas where rank = 4) AS township
     ON cio.township = township.township_id
 ​

组织机构维度设计

实现组织机构维度表的构建,得到每个工程师对应的组织机构信息

image-20211003103949211.png

 --org_employee:员工信息表【员工id、员工编码、员工名称、用户系统id】
 SELECT *FROM ONE_MAKE_DWD.ORG_EMPLOYEE OE ;
 SELECT 
     EMPID,      -- 员工id
     EMPCODE,    -- 员工编码
     EMPNAME,    -- 员工名称
     USERID      -- 用户系统id
 FROM ONE_MAKE_DWD.ORG_EMPLOYEE OEE ;
 DESC ONE_MAKE_DWD.ORG_EMPLOYEE
 ​
 --org_empposition:员工岗位信息表【员工id、岗位id】
 SELECT 
     EMPID,          -- 员工id
     POSITIONID      -- 岗位id
 FROM ONE_MAKE_DWD.ORG_EMPPOSITION OEN ;
 ​
 --org_position:岗位信息表【岗位id、岗位编码、岗位名称、部门id】
 SELECT 
     POSITIONID,     -- 岗位id
     POSICODE,       -- 岗位编码
     POSINAME,       -- 岗位名称
     ORGID           -- 部门id
 FROM ONE_MAKE_DWD.ORG_POSITION OPN ;
 ​
 --org_organization:部门信息表【部门id、部门编码、部门名称】
 SELECT 
     ORGID,      -- 部门id
     ORGCODE,    -- 部门编码
     ORGNAME     -- 部门名称
 FROM ONE_MAKE_DWD.ORG_ORGANIZATION OON ;

实现SQL

 SELECT 
     OEE.EMPID AS `员工id`,EMPCODE AS `员工编码`,EMPNAME AS `员工名称`,USERID AS `用户系统id`,
     OEN.POSITIONID AS `岗位id`,
     POSICODE AS `岗位编码`,POSINAME AS `岗位名称`,
     OON.ORGID AS `部门id`,OON.ORGCODE AS `部门编码`,OON.ORGNAME AS `部门名称`
 FROM 
     (SELECT 
         EMPID,      -- 员工id
         EMPCODE,    -- 员工编码
         EMPNAME,    -- 员工名称
         USERID      -- 用户系统id
     FROM ONE_MAKE_DWD.ORG_EMPLOYEE) AS OEE
 JOIN
     (SELECT 
         EMPID,          -- 员工id
         POSITIONID      -- 岗位id
     FROM ONE_MAKE_DWD.ORG_EMPPOSITION) AS OEN
     ON OEE.EMPID = OEN.EMPID
 JOIN
     (SELECT 
         POSITIONID,     -- 岗位id
         POSICODE,       -- 岗位编码
         POSINAME,       -- 岗位名称
         ORGID           -- 部门id
     FROM ONE_MAKE_DWD.ORG_POSITION) AS OPN
     ON OEN.POSITIONID = OPN.POSITIONID
 JOIN
     (SELECT 
         ORGID,      -- 部门id
         ORGCODE,    -- 部门编码
         ORGNAME     -- 部门名称
     FROM ONE_MAKE_DWD.ORG_ORGANIZATION) AS OON
     ON OPN.ORGID = OON.ORGID