基本业务:一个事件发生后,影响到多个国家,这个事件也会被定一个事件类型(这里简化为type1,2,3),处理这个事件花费多长时间。

我们的事实表就记录这个事情,相对应的我们设计两个维表,一个是国家,一个是事件类型,我们可以从这两个维度slice数据。

因为受影响的国家是多值的,所以一条fact表中的记录,会对应多条维度表中的记录,在这里,我使用了一个桥接表来处理这种多对多

的关系,这是第一种实现方案,是正确的方案。

第二种是我引入了另外一张规范化的表,来直接建立一个星型模型,实现后有一些问题,引以为戒。

因为这种方式实现后,事实表的多行可能都表示同一个事件,只是影响的国家不同而已,这样通过国家维度聚合是没有问题,但是通过

其他维度如事件类型,进行聚合, 就会发生重叠计算。计算事件的count都需要distinct.而在SSAS中还需要单独列出一个measuregroup,

性能上也不佳。

  1. Create database mybi;
  2.  
  3. create table FactIncident(pk int,incidentid int,impactedcountries varchar(2000),incidenttype int,usedHours int);
  4.  
  5. insert into FactIncident values(1,1,'china,japan,India',1,100);
  6.  
  7. insert into FactIncident values(2,2,'china,japan,India,USA',2,200);
  8.  
  9. insert into FactIncident values(3,3,'china,japan',3,300);
  10.  
  11. select * from FactIncident;
  12.  
  13. create table country(cid int,country varchar(50));
  14.  
  15. insert into country values(1,'china');
  16.  
  17. insert into country values(2,'japan');
  18.  
  19. insert into country values(3,'India');
  20.  
  21. insert into country values(4,'USA');
  22.  
  23. create table incidenttype(id int, typename varchar(20));
  24.  
  25. insert into incidenttype values(1,'type1');
  26.  
  27. insert into incidenttype values(2,'type2');
  28.  
  29. insert into incidenttype values(3,'type3');
  30.  
  31. create table bridgeTable(countrieslist varchar(2000),country varchar(50));
  32.  
  33. select * from FactIncident;
  34.  
  35. --insert into bridgeTable
  36.  
  37. --SELECT clist, split.Part.value('text()[1]', 'VARCHAR(30)') as country
  38.  
  39. --FROM (SELECT impactedcountries,CAST('<p>' + REPLACE(impactedcountries,',','</p><p>')+'</p>' AS XML)
  40.  
  41. -- FROM FactIncident) innerQ(clist,xmlField)
  42.  
  43. --CROSS APPLY innerQ.xmlField.nodes('p') split(Part)

如果我们直接构建星型模,需要把多值合并的列数据给规范化起来,需要创建另外一张Fact表,需要如下代码:

  1. create table FactIncidentSplit(pk int,incidentid int,impactedcountryid int,incidenttypeid int,usedHours int);
  2.  
  3. insert into FactIncidentSplit
  4.  
  5. select
  6.  
  7. ROW_NUMBER() over (order by incidentid) as pk,
  8.  
  9. f.incidentid,
  10.  
  11. cc.cid as impactedcountryid,
  12.  
  13. f.incidenttype,
  14.  
  15. f.usedHours
  16.  
  17. from factincident f join
  18.  
  19. (
  20.  
  21. select pk,
  22.  
  23. splits.country.value('text()[1]', 'VARCHAR(30)') as country
  24.  
  25. from
  26.  
  27. (select pk, CAST( '<p>' + REPLACE(impactedcountries,',','</p><p>') +'</p>' as XML)
  28.  
  29. from FactIncident) xx(pk,clist)
  30.  
  31. cross apply xx.clist.nodes('p') splits(country)
  32.  
  33. ) ff
  34.  
  35. on f.pk=ff.pk
  36.  
  37. join
  38.  
  39. country cc
  40.  
  41. on cc.country=ff.country

然后把这张表加到DSV中来,建立好关系,建立一个measuregroup,设定好dimensionusage.

由下图可见,在使用事件类型维度的时候,规范化的事实表的事件总数和花费时长都是有问题的。

当然,如果把国家维度拖进来的话,就会正确。但这种影响是不应该的。

而使用桥接表的事实表是得到了正确的计算。

附件是SSAS项目的压缩文件,欢迎下载:

http://files.cnblogs.com/huaxiaoyao/AnalysisServicesProject1.rar

SSAS-many 2 many one simple sample的更多相关文章

  1. [转]simple sample to create and use widget for nopcommerce

    本文转自:http://badpaybad.info/simple-sample-to-create-and-use-widget-for-nopcommerce Here is very simpl ...

  2. ASP.NET MVC 4 WebAPI Simple Sample

    // Controllers.cs namespace Microshaoft.WebApi.Controllers { using Microshaoft.WebApi.Models; using ...

  3. hdu4975 A simple Gaussian elimination problem.(正确解法 最大流+删边判环)(Updated 2014-10-16)

    这题标程是错的,网上很多题解也是错的. http://acm.hdu.edu.cn/showproblem.php?pid=4975 2014 Multi-University Training Co ...

  4. hdu 4975 A simple Gaussian elimination problem.(网络流,推断矩阵是否存在)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4975 Problem Description Dragon is studying math. One ...

  5. A simple Gaussian elimination problem.(hdu4975)网络流+最大流

    A simple Gaussian elimination problem. Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65 ...

  6. HDOJ 4975 A simple Gaussian elimination problem.

    和HDOJ4888是一样的问题,最大流推断多解 1.把ISAP卡的根本出不来结果,仅仅能把全为0或者全为满流的给特判掉...... 2.在残量网络中找大于2的圈要用一种类似tarjian的方法从汇点開 ...

  7. HDU 4975 A simple Gaussian elimination problem.

    A simple Gaussian elimination problem. Time Limit: 1000ms Memory Limit: 65536KB This problem will be ...

  8. [翻译+山寨]Hangfire Highlighter Tutorial

    前言 Hangfire是一个开源且商业免费使用的工具函数库.可以让你非常容易地在ASP.NET应用(也可以不在ASP.NET应用)中执行多种类型的后台任务,而无需自行定制开发和管理基于Windows ...

  9. Atitit webservice的发现机制 discover机制

    Atitit webservice的发现机制 discover机制 1.1. Ws disconvert 的组播地址和端口就是37021 1.2. Ws disconvert的发现机制建立在udp组播 ...

随机推荐

  1. windbg学习进阶之——windbg字段名及其意义

    要使用windbg分析dump必须加载正确的符号,可以通过设置Symbols File Path为"D:/Symbols;SRV*D:/Symbols*http://msdl.microso ...

  2. JS实现注销功能

    JS实现注销功能,代码如下: <script> window.history.forward(1); </script> 这个代码的用法就是: 比如,我们此时有两个页面:Log ...

  3. Titanium开发环境搭建第三个坑

    Nodejs版本的问题 首先,如下引用:http://docs.appcelerator.com/titanium/latest/#!/guide/Installing_Node To run all ...

  4. jquery 全选 全不选 反选

    1.概述 在项目中经常遇到列表中对复选框进行勾选操作,全选...反选.. 2. example <html> <body> <form id="test-for ...

  5. javascript indexOf startWith

    判断字符串是否以XX开头 1.切割转换   var str = "ababaa",tags = jquery.trim(str); 2. indexOf方法运行   !tags.i ...

  6. Exchange 2013 申请证书

    最近在了解Exchange2013,Exchange2013相对于Lync安装相对容易一点,安装完成并不代表就可以用了,还要一些基本的配制,首先介绍一下如何从证书服务器申请 CA. 一.DNS 创建解 ...

  7. swift学习笔记之-继承

    //继承 import UIKit /* 继承(Inheritance): 1.一个类可以继承(inherit)另一个类的方法(methods).属性(properties)和其它特性.当一个类继承其 ...

  8. andriod RadioButton

    <?xml version="1.0" encoding="UTF-8"?> <LinearLayout android:orientatio ...

  9. oracle10g 统计信息查看、收集

      1. 统计信息查看 1.1 单个表的全局统计信息.统计效果查看 2. 统计信息分析(收集) 2.1 分析工具选择 2.2 分析前做index重建 2.3 分析某数据表,可以在PL/SQL的comm ...

  10. 安卓开发_浅谈Android动画(一)

    动画效果,针对图片实现 现在学习四种基本的简单动画效果 一.Tween Animation共同属性 1.Duration:动画持续时间(毫秒单位) 2.fillAfter:设置为true,动画转化在动 ...