当前位置: 首页 > news >正文

【自记】Power BI 中FILTER、CALCULATE 和 CALCULATETABLE 三个函数详细说明

        这三个都是 DAX 中用于处理筛选逻辑的核心函数,其中 CALCULATE(返回标量值)和 CALCULATETABLE(返回表)是 “兄弟函数”,而 FILTER 是用于生成筛选表的基础函数。以下从功能、语法、关联与区别三个方面详细说明:

一、三个函数的核心定位

函数类型返回结果核心作用
FILTER表函数子表(Table)按行级条件筛选表,返回满足条件的所有行
CALCULATE标量函数单个值(Scalar)修改筛选上下文后,计算表达式的结果
CALCULATETABLE表函数表(Table)

修改筛选上下文后,返回经过筛选的表

二、语法与参数

1. FILTER 函数
  • 语法FILTER(<表>, <条件表达式>)
  • 参数
    • <表>:需要筛选的原始表(如 '订单表')。
    • <条件表达式>:返回 TRUE/FALSE 的逻辑判断(如 '订单表'[金额] > 1000)。
  • 特点:逐行检查原始表,保留满足条件的行,生成子表。
2. CALCULATE 函数
  • 语法CALCULATE(<表达式>, <筛选器1>, <筛选器2>, ...)
  • 参数
    • <表达式>:需要计算的标量表达式(如 SUM('订单表'[金额]))。
    • <筛选器>(可选):1 个或多个筛选条件(如 '产品表'[类别] = "电子产品")。
  • 特点:先应用所有筛选器修改上下文,再计算表达式的值,返回单个结果。
3. CALCULATETABLE 函数
  • 语法CALCULATETABLE(<表>, <筛选器1>, <筛选器2>, ...)
  • 参数
    • <表>:需要处理的原始表(如 '订单表')。
    • <筛选器>(可选):与 CALCULATE 相同的筛选条件。
  • 特点:先应用所有筛选器修改上下文,再返回经过筛选的表(与 CALCULATE 逻辑一致,但返回表而非标量)。

三、关联与区别:通过示例理解

        假设场景:'订单表' 包含 [订单ID][金额][订单日期]'产品表' 包含 [产品ID][类别],两表已关联。

1. FILTER 与 CALCULATETABLE 的对比(均返回表)
  • FILTER 示例:筛选金额 > 1000 的订单

    dax

    高金额订单_Filter = FILTER('订单表', '订单表'[金额] > 1000)
    
    • 逻辑:直接逐行判断 “金额是否> 1000”,保留满足条件的行。
  • CALCULATETABLE 示例:同样筛选金额 > 1000 的订单

    dax

    高金额订单_CalcTable = CALCULATETABLE('订单表', '订单表'[金额] > 1000)
    
    • 逻辑:通过筛选器参数 “强制筛选金额> 1000”,返回符合条件的表。
  • 差异

    • FILTER 是 “行级迭代筛选”,适合复杂的行级条件(如跨表字段判断,需配合 RELATED)。
    • CALCULATETABLE 是 “上下文筛选”,适合直接应用筛选器,性能通常更优(尤其大数据量时)。
2. CALCULATE 与 CALCULATETABLE 的对比(同根同源)
  • CALCULATE 示例:计算 “电子产品” 类别的总销售额

    dax

    电子产品销售额 = CALCULATE(SUM('订单表'[金额]),  // 标量表达式'产品表'[类别] = "电子产品"  // 筛选器
    )
    
    • 逻辑:先将上下文限定为 “电子产品”,再计算该类别下的销售额总和(返回单个值)。
  • CALCULATETABLE 示例:返回 “电子产品” 类别的所有订单表

    dax

    电子产品订单表 = CALCULATETABLE('订单表',  // 表'产品表'[类别] = "电子产品"  // 筛选器
    )
    
    • 逻辑:与上例筛选逻辑完全相同,但返回的是符合条件的订单表(而非总和)。
  • 关联:二者共享相同的 “筛选上下文修改逻辑”,只是返回结果类型不同(标量 vs 表)。

3. 三个函数的结合使用

FILTER 常作为筛选器参数嵌套在 CALCULATE 或 CALCULATETABLE 中,实现更复杂的筛选:

  • 示例:计算 “2023 年金额> 1000 的订单总金额”

    dax

    2023高金额销售额 = CALCULATE(SUM('订单表'[金额]),  // 标量计算FILTER(  // 用FILTER生成复杂筛选器'订单表',YEAR('订单表'[订单日期]) = 2023 && '订单表'[金额] > 1000)
    )
    

  • 逻辑:FILTER 先筛选出 2023 年且金额 > 1000 的订单行,CALCULATE 基于这个筛选结果计算总和。

    四、总结

    1. 功能定位

      • FILTER:生成符合行级条件的子表(基础筛选工具)。
      • CALCULATE:修改上下文后计算标量值(用于度量值、计算列中的动态计算)。
      • CALCULATETABLE:修改上下文后返回表(用于生成动态子表)。
    2. 核心差异

      • FILTER 是 “行迭代筛选”,CALCULATE/CALCULATETABLE 是 “上下文筛选”。
      • CALCULATE 与 CALCULATETABLE 逻辑一致,仅返回类型不同(值 vs 表)。
    3. 使用场景

      • 简单行筛选:用 FILTER 或 CALCULATETABLE(后者更高效)。
      • 动态计算值:用 CALCULATE(如度量值)。
      • 复杂筛选逻辑:FILTER 嵌套到 CALCULATE/CALCULATETABLE 中。

    ——————————————————————————————

    补充

      FILTER 函数中可以使用 &&(逻辑与)、||(逻辑或)等逻辑运算符组合多个筛选条件,实现更复杂的行级筛选。例如:

    dax

    // 筛选2023年且金额>1000的订单
    FILTER('订单表',YEAR('订单表'[订单日期]) = 2023 && '订单表'[金额] > 1000
    )
    

    这里用 && 同时满足两个条件,只有都为 TRUE 时,该行才会被保留。

    http://www.lryc.cn/news/626311.html

    相关文章:

  • React框架超详细入门到实战项目演练【前端】【React】
  • React15.x版本 子组件调用父组件的方法,从props中拿的,这个方法里面有个setState,结果调用报错
  • 【Coze】Windows 环境下使用 Docker 部署 Coze Studio 的详细指南
  • 基于分布式环境的令牌桶与漏桶限流算法对比与实践指南
  • Day 40:训练和测试的规范写法
  • 008.Redis Cluster集群架构实践
  • RabbitMQ:SpringAMQP Topic Exchange(主题交换机)
  • Linux中Cobbler服务部署与配置(快速部署和管理 Linux 系统)
  • mac电脑软件左上角的关闭/最小化/最大化按钮菜单的宽度和高度是多少像素
  • Mac 4步 安装 Jenv 管理多版本JDK
  • Mac 上安装并使用 frpc(FRP 内网穿透客户端)指南
  • 第四章:大模型(LLM)】07.Prompt工程-(4)思维链(CoT, Chain-of-Thought)Prompt
  • 第四章:大模型(LLM)】07.Prompt工程-(5)self-consistency prompt
  • 编译安装 Nginx
  • 从AI小智固件到人类智能:计算技术的层级跃迁
  • Linux-----《Linux系统管理速通:界面切换、远程连接、目录权限与用户管理一网打尽》
  • JavaScript 检查给定的四个点是否形成正方形(Check if given four points form a square)
  • [特殊字符] 小豆包 API 聚合平台:让 AI 接入更简单、更高效
  • PyTorch API 7
  • Linux 文件系统权限管理(补充)
  • pinctrl和gpio子系统实验
  • 前后端联合实现文件上传,实现 SQL Server image 类型文件上传
  • LeetCode热题100--101. 对称二叉树--简单
  • 【Kafka】常见简单八股总结
  • 力扣 30 天 JavaScript 挑战 第36天 第8题笔记 深入了解reduce,this
  • Linux Shell 常用操作与脚本示例详解
  • CNN 在故障诊断中的应用:原理、案例与优势
  • DAY 50 预训练模型+CBAM模块
  • 排查Redis数据倾斜引发的性能瓶颈
  • VScode ROS文件相关配置