MDX Step by Step 读书笔记(四) - Working with Sets (使用集合) - Limiting Set and Auto-Exists

本文探讨了SSAS中的LimitingSets与WorkingwithAuto-Exists的概念,通过多个实例展示了如何利用这些特性来优化查询结果,并揭示了自动匹配在不同维度间的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Limiting Sets 限制集合 Working with Auto-Exists 自动存在如何干活的

读完和实践完这一小章节例子后,我对这样的Limiting Sets 和 Working with Auto-Exists 有自己的理解。Limiting Sets 可以理解为SSAS 限制了Sets 集合的大小,如何限制的呢?我理解就是这里的 “Auto-Exists”自动存在,通俗理解就是两个Sets 集合之间成员与成员存在某种关联关系的时候才匹配在一起,没有关系的忽略,这就是自动(匹配是否)存在的意思。

为什么要限制,我们可以通过以下这些例子来加深和理解。

示例一

SELECT
{
            ([Date].[Calendar].[CY 2002]),
            ([Date].[Calendar].[CY 2003]),
            ([Date].[Calendar].[CY 2004])
} *
{
            ([Measures].[Reseller Sales Amount]),
            ([Measures].[Internet Sales Amount])
} ON COLUMNS,
{[Product].[Category].[Category].Members} ON ROWS
FROM [Step-by-Step]
WHERE ([Geography].[Country].[United States]);

Messages 里面的内容

Executing the query ...
Obtained object of type: Microsoft.AnalysisServices.AdomdClient.CellSet
Formatting.
Cell set consists of 6 rows and 7 columns.
Done formatting.
Execution complete

在 SELECT 语句的 COLUMNS 中,第一个集合有3个元组,第二个集合有2个度量值元组,通过CrossJoin 或者 * 运算可以算出总共应该有 3*2=6 个列。在 SELECT 语句的 ROWS 中,只有4个成员。所以最终 SSAS 查询返回的结果应该是一个 4行6列这样的一个结果,再加上行表头和列表头,所以最终一起返回 6行7列,这个过程和结果是正确的。

示例二

在开始示例二之前,先看这样的一个例子。

WITH MEMBER [Measures].[Subcategory Count]
AS
COUNT([Product].[Subcategory].[Subcategory].Members)
SELECT [Measures].[Subcategory Count] ON COLUMNS
FROM [Step-by-Step];

这个例子就是计算一下Subcategory Level 下总共有多少个成员,通过查询总共有37个。

 

先记住这个数字,然后再开始我们的例子。

SELECT
{
            ([Date].[Calendar].[CY 2002]),
            ([Date].[Calendar].[CY 2003]),
            ([Date].[Calendar].[CY 2004])
} *{
            ([Measures].[Reseller Sales Amount]),
            ([Measures].[Internet Sales Amount])
} ON COLUMNS,
{[Product].[Category].[Category].Members} *
{[Product].[Subcategory].[Subcategory].Members} ON ROWS
FROM [Step-by-Step]
WHERE ([Geography].[Country].[United States])

按照我们在示例一中的理解,在 SELECT 语句中的 COLUMNS 结构里,总共有6个列。

在 SELECT 语句中的 ROWS 结构里,总共应该是有 4*37 = 148 行。再加上 Calendar 和 Measures 组成的2行的列标题以及 Category 和 Subcategory 组合起来占用了2列的行标题,那么总共 SSAS 返回到我们的查询客户端应该总共是 150行8列的内容。

我们先查询,然后查看Messages 信息。

Messages 里的信息

Executing the query ...
Obtained object of type: Microsoft.AnalysisServices.AdomdClient.CellSet
Formatting.
Cell set consists of 39 rows and 8 columns.
Done formatting.
Execution complete

和我们预计不一样的地方是-总共只返回了 39行和8列,列的数目是我们所期望的, 但是39行与我们所期望的150行相差太远。

原因就在于在 SSAS 中, 虽然我们使用的是 Cross Join 或者 * 使两个集合中的元素交叉相乘,但是SSAS 在处理的时候并不会把两个没有任何关联关系的成员放在一起形成一行数据。例如, Subcategory 中的 Mountain Bikes 只会属于 Category 下的 Bikes 而不会属于 Category 中的 Accessories。所以即使让 Category Cross Join  Subcategory,Subcategory 也只会找自己相关联的父属性。因此可以想象的到,总共有37个Subcategory,那么最终返回的也应该是37 行数据再加上2行的列标题,Subcategory 会自动地被分类到各自的Category 下。一个Category 有一个或者多个Subcategory,而每一个Subcategory 只会属于一个 Category。

另外还有一点就是 Category 和 Subcategory 是有直接的关联关系的,它们存在于Product里的层次结构中,这一点可以在 Product 纬度结构中看得到。

另外,即使在层次结构中查不到这种直接的关联样式,但是也不能否定它们在纬度表中也一定存在这种直接关联的关系。

这大概就应该是 Limiting Sets 限制集合大小 和 Auto-Exists 自动存在的解释,可能Auto-Exists 应该叫做 Auto-Matching 比较好。

下面示例三要解释的是一个没有直接关联关系的Cross Join,来看看 Auto-Exists 是否还发生了作用。

WITH MEMBER [Measures].[Color Type]
AS
COUNT([Product].[Color].[Color].Members )
SELECT [Measures].[Color Type] ON COLUMNS
FROM [Step-by-Step];

查看一下 Color 的种类,通过查询发现有10个颜色分类。

示例三

SELECT
{
            ([Date].[Calendar].[CY 2002]),
            ([Date].[Calendar].[CY 2003]),
            ([Date].[Calendar].[CY 2004])
} *
{
            ([Measures].[Reseller Sales Amount]),
            ([Measures].[Internet Sales Amount])
} ON COLUMNS,
{[Product].[Category].[Category].Members} *
{[Product].[Color].[Color].Members} ON ROWS
FROM [Step-by-Step]
WHERE ([Geography].[Country].[United States])

按照最原始的分析,行的数目应该是 4*10 = 40 行,再加上两行的列表头总共是42行。

但是看看 Messages 的内容总共只返回了25行-2行= 23行数据。

Executing the query ...
Obtained object of type: Microsoft.AnalysisServices.AdomdClient.CellSet
Formatting.
Cell set consists of 25 rows and 8 columns.
Done formatting.
Execution complete

说明 Auto-Exists 起了作用,就不在这里一一验证它们匹配是否正确不正确了。

最后一个示例来说明在切片轴的处理过程中,Auto-Exists 也起到了作用。

示例四

SELECT
{
            ([Date].[Calendar].[CY 2002]),
            ([Date].[Calendar].[CY 2003]),
            ([Date].[Calendar].[CY 2004])
} *
{
            ([Measures].[Reseller Sales Amount]),
            ([Measures].[Internet Sales Amount])
} ON COLUMNS,
{[Product].[Category].[Category].Members} *
{[Product].[Color].[Color].Members} ON ROWS
FROM [Step-by-Step]
WHERE ([Geography].[Country].[United States],
[Product].[Subcategory].[Mountain Bikes])

在WHERE 条件中加上了一个[Product].[Subcategory].[Mountain Bikes].这里最主要要表达的是在限制完 [Product].[Subcategory].[Mountain Bikes] 这个空间后,Product Category 使用了一个 Cross Join 和Product Color进行了一个交叉连接,那么它们也超不过 Mountain Bikes 这个范围,这也是 Auto-Exists 起到的作用。

返回的数据一定是属于 Mountain Bikes 这个Subcategory当然也属于 United States 的范畴

更多 BI 文章请参看 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)  如果觉得这篇文章看了对您有帮助,请帮助推荐,以方便他人在 BIWORK 博客推荐栏中快速看到这些文章。

1. 用户与权限管理模块 角色管理: 学生:查看实验室信息、预约设备、提交耗材申请、参与安全考核 教师:管理课题组预约、审批学生耗材申请、查看本课题组使用记录 管理员:设备全生命周期管理、审核预约、耗材采购与分发、安全检查 用户操作: 登录认证:统一身份认证(对接学号 / 工号系统,模拟实现),支持密码重置 信息管理:学生 / 教师维护个人信息(联系方式、所属院系),管理员管理所有用户 权限控制:不同角色仅可见对应功能(如学生不可删除设备信息) 2. 实验室与设备管理模块 实验室信息管理: 基础信息:实验室编号、名称、位置、容纳人数、开放时间、负责人 功能分类:按学科(计算机实验室 / 电子实验室 / 化学实验室)标记,关联可开展实验类型 状态展示:实时显示当前使用人数、设备运行状态(正常 / 故障) 设备管理: 设备档案:名称、型号、规格、购置日期、单价、生产厂家、存放位置、责任人 全生命周期管理: 入库登记:管理员录入新设备信息,生成唯一资产编号 维护记录:记录维修、校准、保养信息(时间、内容、执行人) 报废处理:登记报废原因、时间,更新设备状态为 "已报废" 设备查询:支持按名称、型号、状态多条件检索,显示设备当前可用情况 3. 预约与使用模块 预约管理: 预约规则:学生可预约未来 7 天内的设备 / 实验室,单次最长 4 小时(可设置) 预约流程:选择实验室→选择设备→选择时间段→提交申请(需填写实验目的) 审核机制:普通实验自动通过,高危实验(如化学实验)需教师审核 使用记录: 签到 / 签退:到达实验室后扫码签到,离开时签退,系统自动记录实际使用时长 使用登记:填写实验内容、设备运行情况(正常 / 异常),异常情况需详细描述 违规管理:迟到 15 分钟自动取消预约,多次违规限制预约权限 4. 耗材与安全管理模块 耗材管理: 耗材档案:名称、规格、数量、存放位置、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值