DAX:GROUPBY函数

news2024/11/23 22:01:44

DAX 中的 SUMMARIZE 函数功能强大,但同时也很难使用。 它可用于执行表之间的分组和连接,正如我们之前在分组数据一文中描述的那样。 不幸的是,它在计算聚合值时存在一些众所周知的性能问题。除了性能之外,SUMMARIZE 的计算限制是它无法聚合在查询本身内动态计算的值。

一,SUMMARIZE函数的限制

例如,考虑以下查询,它应该为每个产品类别返回相关子类别的平均价格的最大值。

ADDCOLUMNS (
    SUMMARIZE (
        ADDCOLUMNS (
            SUMMARIZE (
                Product,
                'Product Category'[Category],
                'Product Subcategory'[Subcategory]
            ),
            "Average Price", CALCULATE ( AVERAGE ( Product[Unit Price] ) )
        ),
        'Product Category'[Category]
    ),
    "Max SubCat Avg Price", CALCULATE ( MAX ( [Average Price] ) )
)

如果运行此查询,计算 MAX ( [Average Price] ) 时会出现错误。 原因是在 DAX 中您只能聚合物理列(physical column)。 事实上,请记住这个等价物:

MAX ( table[expression] ) = MAXX ( table, table[expression] )

如果您尝试聚合在查询中计算的列(例如本例中的Average Price列),引擎将无法找到相应的 MAXX 函数,因此您会得到一个错误。 您可以通过重写查询避免嵌套的 SUMMARIZE 调用来获得所需的结果。

ADDCOLUMNS (
    VALUES ( 'Product Category'[Category] ),
    "Max SubCat Avg Price", CALCULATE (
        MAXX (
            ADDCOLUMNS (
                SUMMARIZE (
                    Product,
                    'Product Category'[Category],
                    'Product Subcategory'[Subcategory]
                ),
                "Average Price", CALCULATE ( AVERAGE ( Product[Unit Price] ) )
            ),
            [Average Price]
        )
    )
)

除了冗长之外,这种方法效率不高。 如果您想计算最低和最高平均价格,您将复制内部 SUMMARIZE,需要更长的执行时间。

二,引入GROUPBY函数

GROUPBY 函数的语法类似于 SUMMARIZE,尽管其语义不同。 事实上,它解决了我们在对值进行分组时在 SUMMARIZE 中遇到的问题,因此您可以避免本文中描述的模式 ADDCOLUMNS/SUMMARIZE 而只依赖 GROUPBY。

然而,即使使用 GROUPBY,您也不能使用我们在开始时看到的语法,因为聚合内部计算列的限制仍然存在。 您必须使用一个新函数 CURRENTGROUP,它允许访问内部组,因此您具有 aggX 函数的表参数,并且您可以通过行上下文以这种方式访问计算列。

注意:CURRENTGROUP ()函数只能用于GROUPBY 函数中。GROUPBY返回一组group,每个group有多个数据行(row),CURRENTGROUP ()函数用于从GROUPBY的结果中返回当前group。

GROUPBY (
    ADDCOLUMNS (
        GROUPBY (
            Product,
            'Product Category'[Category],
            'Product Subcategory'[Subcategory]
        ),
        "Average Price", CALCULATE ( AVERAGE ( Product[Unit Price] ) )
    ),
    'Product Category'[Category],
    "Max SubCat Avg Price", MAXX ( CURRENTGROUP (), [Average Price] )
)

您必须在 GROUPBY 调用中使用 CURRENTGROUP,因此您不能使用ADDCOLUMNS 函数来添加新的计算列。仅当您在不使用 CALCULATE 或引用度量的情况下显式编写计算时,您才能摆脱 ADDCOLUMNS:这些操作在 GROUPBY 中是不允许的(目前唯一支持的用途是在聚合函数中调用 CURRENTGROUP),因此您仍然必须依赖 ADDCOLUMNS 以防您需要过滤上下文。 因此,您可以在不使用 ADDCOLUMNS 函数的情况下使用以下语法来计算平均价格列。

GROUPBY (
    GROUPBY (
        Product,
        'Product Category'[Category],
        'Product Subcategory'[Subcategory],
        "Average Price", AVERAGEX ( CURRENTGROUP() , Product[Unit Price] )
    ),
    'Product Category'[Category],
    "Max SubCat Avg Price", MAXX ( CURRENTGROUP (), [Average Price] )
)

结论:每当您想在迭代器中访问组的行时,您应该考虑使用 GROUPBY 而不是 ADDCOLUMNS/SUMMARIZE。 每当您有嵌套的分组操作时,这是必需的。 您可以在最里面的组中使用 SUMMARIZE,但必须使用 GROUPBY 才能访问在内部分组函数中计算的列。

参考文档:

Nested grouping using GROUPBY vs SUMMARIZE

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/73972.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ArrayList中的 subList 强转 ArrayList 导致异常

阿里《Java开发手册》上提过 [强制] ArrayList的sublist结果不可強转成ArrayList,否则会抛出ClassCastException异常,即java.util.RandomAccesSubList cannot be cast to java. util.ArrayList. 说明: subList 返回的是ArrayList 的内部类SubList, 并不是ArrayList …

一块RTX 3090加速训练YOLOv5s,时间减少11个小时,速度提升20%

作者|BBuf 很高兴为大家带来One-YOLOv5的最新进展,在《一个更快的YOLOv5问世,附送全面中文解析教程》发布后收到了很多算法工程师朋友的关注,十分感谢。 不过,可能你也在思考一个问题:虽然OneFlow的兼容性做…

SQL之substrate()函数用法

测试表字段查询如下: 测试在hive中截取前5位字符的第1种写法: 测试在hive中截取前5位字符的第2种写法: 测试在impala中截取前5位字符的第1种写法: 测试在impala中截取前5位字符的第2种写法: 结果: 1、在h…

带分数(蓝桥杯C/C++B组真题详解)

目录 题目 题目思路 题目代码 注解: 1.题目给定的判定条件为 2.关于next_permutation(start,end); 题目: 题目思路: 因为题目要求是满足在1到9中 不重复、不遗漏的所有满足条件的情况 所以我们可以通过全排列 把整数、分子、分母 …

B-树(B-Tree)与二叉搜索树(BST):讲讲数据库和文件系统背后的原理(读写比较大块数据的存储系统数据结构与算法原理)...

人类总喜欢发明创造一些新名词(比如说,简写/缩写/简称什么的),并通过这些名词把人群分成了三六九等。弄到最后,把自己都绕晕了。你看,首先就是,B树,不要与Binary tree或Btree混淆。B…

有奖征文 | 当我们谈操作系统时,我们在谈什么?

OS,Operating System,操作系统,计算机中最基本也是最重要的基础性系统软件。1991 年,大二学生 Linus Torvalds 写出 Linux0.01,经过几十年的发展,以 Linux 为代表的服务器操作系统,成长为一个既…

lambda之Stream流式编程

lambda之Stream流式编程 一、什么是 Stream Stream中文称为 “流”,通过将集合转换为这么一种叫做“流”的元素序列,通过声明性方式,能够对集合中的每个元素进行一系列并行或串行的流水线操作。换句话说,你只需要告诉流你的要求…

led护眼台灯对眼睛好?过来人说说led护眼灯是否真的能护眼

众所周知,现在绝大部分光源都是使用led发光,无论是室内照明灯、室外装饰灯、气氛调节灯、工作学习护眼台灯等等,都是使用led灯珠,那么也就有人会问了:led灯真的对眼睛好吗?Led护眼台灯真的能护眼吗&#xf…

TH7-搜附近

TH7-搜附近说明1、探花1.1、查询推荐列表dubbo服务1.1.1、实体对象1.1.2、定义接口1.1.3、编写实现1.1.4、单元测试1.2、查询推荐列表APP接口实现1.2.1、TanHuaController1.2.2、TanHuaService1.2.3、测试1.3、喜欢的dubbo服务1.3.1、定义接口1.3.2、编写实现1.4、左滑右滑1.4.…

fofa搜索漏洞技巧

fofa搜索漏洞技巧整理,主要有以下十个方面:搜索HTTP响应头中含有"thinkphp"关键词的网站和IP;加上标题带有后台的;加上时间,现在新网站有thinkphp日志泄露的有很多; 搜索html正文中含有"管理后台"关键词的网站和IP body="管理后台"等。 …

Linux内核缓存

【推荐阅读】 轻松学会linux下查看内存频率,内核函数,cpu频率 纯干货,linux内存管理——内存管理架构(建议收藏) 一篇长文叙述Linux内核虚拟地址空间的基本概括 页缓存和块缓存 内核为块设备提供了两种通用的缓存方案: 页缓存&a…

光华股份深交所上市:市值51亿 应收账款余额超5亿

雷递网 雷建平 12月8日浙江光华科技股份有限公司(简称:“光华股份”,证券代码:001333)今日在深交所主板上市。光华股份本次发行3200万股,发行价为27.76元,募资8.88亿元。光华股份开盘价为33.31元…

开源,是不道德的!

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,非公众号转载保留此声明。请删掉你的github开源代码,让CV工程师成为真正的工程师。不要做真正的代码分享,因为除了满足一下你的虚荣…

vue-cli中学习vue

vue部分知识 大部分学习内容及代码在gitee仓库 生命周期 基本介绍 生命周期描述beforeCreate组件实例被创建之初created组件实例已经完全创建beforeMount组件挂载之前mounted组件挂载到实例上去之后beforeUpdate组件数据发生变化,更新之前updated组件数据更新之后…

springboot知识点

基本介绍 微服务最早由Martin Fowler与James Lewis于2014年共同提出,微服务架构风格是一种使用一套小服务来开发单个应用的方式途径,每个服务运行在自己的进程中,并使用轻量级机制通信,通常是HTTP API,这些服务基于业…

TH8-小视频方案

TH8-小视频方案说明1、我的访客1.1、dubbo服务1.1.1、实体对象1.1.2、定义接口1.1.3、编写实现1.2、记录访客数据1.3、首页谁看过我1.3.1、VO对象1.3.2、MovementController1.3.3、MovementService2、小视频功能说明3、FastDFS2.1、FastDFS是什么?2.2、工作原理2.1.…

会员消费占比高达96%,孩子王究竟是怎么做到的?

👆点击关注公众号👆1.孩子王:依靠会员“稳江山”2021年上半年,增长黑盒独家发布了一篇关于孩子王的研究文章《万字拆解孩子王:充满矛盾的母婴零售之王》,彼时,孩子王尚在二度上市的前夕等待敲钟…

JAVA SCRIPT设计模式--行为型--设计模式之Template Method模板方法(22)

JAVA SCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVA SCRIPT语言来实现主体功能,所以不可能像C,JAVA等面向对象语言一样严谨,大部分程序都附上了JAVA SCRIPT代码,代码只是实现了设计模式的主体功能,不代…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java课程教学过程f6oz5

对于即将毕业或者即将做课设的同学而言,由于经验的欠缺,面临的第一个难题就是选题,确定好题目之后便是开题报告,如果选题首先看自己学习那些技术,不同技术适合做不同的产品,比如自己会些简单的Java语言&…

BSV 上的 Graftroot

我们已经演示了如何使用无合约的合约在 BSV 上实现 Taproot。我们将展示了其后续提案 Graftroot 可以以类似的方式实施。 BTC 中的 Grabroot 与 Taproot 类似,有两种方式可以使用锁定在由多方创建的聚合公钥 P 中的资金: 合作案例:又名默认…