递归的应用有时是非常重要的,特别在迭代一个集合的时候。为什么这么说呢?原因在于迭代在MDX中的使用是基于集合函数的,像 GENERATE() 它们都需要遍历整个集合。但是如果这个集合非常的庞大,我们仅仅只需要在集合中查找一部分特定的东西,那么能够在找到需要的内容时就立刻停止的话,这就可以提高不少效率了。

下面这个查询返回4个财年以及它们总共的 Order Count -

SELECT
{[Measures].[Order Count]} ON 0,
NON EMPTY
{Descendants([Date].[Fiscal Weeks].[All Periods],1,SELF_AND_BEFORE)
} ON 1
FROM [Adventure Works]

现在来看看基于 Week 级别计算Daily 平均值,并且 Week 级别的平均值是基于年 Year 级别的。

WITH
MEMBER [Measures].[Average of an average] AS
IIF(IsLeaf([Date].[Fiscal Weeks].CurrentMember),[Measures].[Order Count],AVG([Date].[Fiscal Weeks].CurrentMember.Children,[Measures].[Average of an average])
)
, FORMAT_STRING = '#,#'
SELECT
{[Measures].[Order Count],[Measures].[Average of an average]} ON 0,
NON EMPTY
{Descendants([Date].[Fiscal Weeks].[All Periods],1,SELF_AND_BEFORE)
} ON 1
FROM [Adventure Works]

第一行的结果是 ALL Periods 这个成员的,它的结果是根据它的下一层级上年计算平均值得到的,(56+84+435+195)/4 = 193。 那么年这个层次上的结果是根据 Weekly Value 求平均值计算出来的,只不过在这里没有显示而已。

为了实现递归,我们必须在同一个计算成员中指定一个表达式,这个表达式中也会使用到当前的计算成员。为了停止这个递归过程,必须有一个条件失去对自身计算成员的引用。

分析一下我们的这个例子,首先 Fiscal Years 不是 Fiscal Weeks 的叶节点,因此在 IIF() 函数中为 False。那么就会走向下面这段代码为它下面的子集成员计算平均值,那么在计算子集成员的平均值的时候,由于继续引用了自身定义的 [Measures].[Average of an average],因此将接着继续计算子集成员的子集直到最下面的子集成员是叶成员为止。

AVG([Date].[Fiscal Weeks].CurrentMember.Children,[Measures].[Average of an average]
)

更多 BI WORK 博客系列看参看 - BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)

转载于:https://www.cnblogs.com/biwork/p/3456089.html

MDX Cookbook 08 - 基于集合上的迭代递归相关推荐

  1. 《Python Cookbook 3rd》笔记(4.12):不同集合上元素的迭代

    不同集合上元素的迭代 问题 你想在多个对象执行相同的操作,但是这些对象在不同的容器中,你希望代码在不失可读性的情况下避免写重复的循环. 解法 itertools.chain() 方法可以用来简化这个任 ...

  2. 子空间迭代法 matlab,基于MATLAB的一类迭代分析

    一般的计算方法教程如文献[1-5]都会介绍三种常见的迭代法,即Jacobi方法.Gauss-Seidel方法和SOR迭代.由于Gauss-Seidel方法充分利用了迭代过程的新信息[1,2],一般来说 ...

  3. u-boot-2009.08在2440上的移植详解(三)

    一.移植环境 主  机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2.tgz u-b ...

  4. SIGIR 2021 | 基于不确定性正则化与迭代网络剪枝的终身情感分类方法

    导读 终身学习能力对于情感分类器处理网络上连续的意见信息流而言至关重要.然而,执行终身学习对于深度神经网络来说是困难的,因为持续地训练可用信息会不可避免地会导致灾难性遗忘.发表在信息检索领域顶会 SI ...

  5. sql编程接收一个集合_T-SQL是基于集合的编程方法的资产

    sql编程接收一个集合 介绍 (Introduction) This article is the third and last one of a series of articles that ai ...

  6. sql编程接收一个集合_T-SQL中基于集合的程序编程方法简介

    sql编程接收一个集合 介绍 (Introduction) Most IT professionals started their studies or careers by learning pro ...

  7. (小甲鱼python)集合笔记合集一 集合(上)总结 集合的简单用法 集合的各种方法合集:子、交、并、补、差、对称差集、超集

    一.基础复习 集合与字典区别 集合中所有元素都是独一无二的,并且也是无序的. 集合具有唯一性.无序性.有限性 >>> type({}) #字典 <class 'dict'> ...

  8. JavaSE部分(集合上)

    集合上(Collection Iterator 泛型) 写在前面:分享技术,共同进步,把写的笔记搬运至博客,有不足请见谅,相关意见可评论告知 ╰( ̄ω ̄o) 编程路漫漫,学习无止尽! 文章目录 集合上 ...

  9. 智能图像处理:基于边缘去除和迭代式内容矫正的复杂文档图像校正

    本文简要介绍ACM MM 2022录用论文"Marior: Margin Removal and Iterative Content Rectification for Document D ...

  10. 转:基于iOS上MDM技术相关资料整理及汇总

    转自:http://www.mbaike.net/mdm/6.html 一.MDM相关知识: MDM (Mobile Device Management ),即移动设备管理.在21世纪的今天,数据是企 ...

最新文章

  1. Still unable to dial persistent://blog.csdn.net:80 after 3 attempts
  2. Learning Collaborative Agents with Rule Guidance for Knowledge Graph Reasoning-学习笔记
  3. python实现Matlab中的circshift函数
  4. P6640-[BJOI2020]封印【SAM,二分】
  5. zoj 3761(并查集+搜索)
  6. 计算机网络令牌总线在哪一页,计算机网络应用基础综合练习
  7. 智慧乡村建设不可照搬城市模式
  8. 8.Shell 编程从入门到精通 --- 文本处理利器 awk
  9. 18. JavaScript event 对象
  10. 在线表格 x-spreadsheet(web excel)1.0.14 发布
  11. 计算机ps基础知识教案范文,计算机制图软件ps教案内页.doc
  12. 广告学计算机平面设计(1)形考5,精编国家开放大学电大专科《计算机平面设计》网络课形考任务1答案.docx...
  13. xp系统无法访问服务器共享打印机,XP系统无法访问共享打印机解决方案
  14. QCC3040---earbudUi module
  15. oblog46_Final_20080623 软件下载
  16. 使用XMind编写测试用例
  17. 首次公开,用了三年的 pandas 速查表
  18. ubuntu16.04通过网络访问windows共享文件夹(samba)
  19. MySQL基础架构:一条SQL“查询语句”是如何执行的
  20. 小程序如何租用云服务器,开发小程序怎样租用云服务器

热门文章

  1. 深入分析java线程池的理解
  2. 思达报表工具Style Report基础教程—通过镜像,子表和联合将逗号分隔的字段内容处理成多行数据...
  3. Node.js与Golang使用感受与小结【二】
  4. 国外字体设计师也是蛮重视数学的
  5. 我中的第一标:4000人中脱颖而出的威客
  6. WATM与Tivoli、SIM同获2007网络技术大会网管系统选择奖
  7. java如何查看jar编译的jdk版本
  8. Luogu1904 天际线
  9. promise入门的准备工作-(尚硅谷教程笔记)
  10. php生成图片不显示,php绘图不显示图片怎么办