SQLMesh 内置宏详解:@PIVOT等常用宏的核心用法与示例

本文系统解析 SQLMesh 的四个核心内置宏,涵盖行列转换的 @PIVOT、精准去重的 @DEDUPLICATE、灵活生成日期范围的 @DATE_SPINE,以及动态表路径解析的 @RESOLVE_TEMPLATE。通过真实案例演示参数配置与 SQL 渲染逻辑,并对比宏调用与传统 SQL 的差异,助您高效构建标准化数据处理流程。

SQLMesh 提供了一系列强大的内置宏,用于简化 SQL 查询和数据处理任务。本文将深入介绍四个常用宏:

  1. @PIVOT:将长格式数据转换为宽格式(行列转换)。
  2. @DEDUPLICATE:基于分区列和排序条件去重。
  3. @DATE_SPINE:生成日期范围表,便于时间序列分析。
  4. @RESOLVE_TEMPLATE:动态解析表路径,适用于云存储场景。

通过实际示例,我们将展示这些宏如何提升 SQL 查询的灵活性和效率。在这里插入图片描述

在这里插入图片描述

1. @PIVOT:行列转换利器

功能概述

@PIVOT 用于将长格式数据(单列存储多个值)转换为宽格式(每行对应多个列)。常用于统计分析,如订单状态分布、用户行为分类等。

参数说明

参数说明默认值
column要透视的列必填
values用于透视的值列表必填
alias是否为结果列添加别名true
agg聚合函数(如 SUM, COUNTSUM
cmp比较运算符(=, >, <=
prefix / suffix别名前缀/后缀
then_value / else_value条件成立/不成立时的值1 / 0
quote是否对别名加引号true
distinct聚合时是否去重false

示例

假设有一个 rides 表,记录骑行订单状态(cancelled, completed),我们希望统计每日各状态的订单数:

SQLMesh 宏写法
SELECTdate_day,@PIVOT(status, ['cancelled', 'completed'])
FROM rides
GROUP BY 1
渲染后的 SQL
SELECTdate_day,SUM(CASE WHEN status = 'cancelled' THEN 1 ELSE 0 END) AS "'cancelled'",SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) AS "'completed'"
FROM rides
GROUP BY 1
进阶用法

如果只想统计 completed 状态的订单数,并计算取消率:

SELECTdate_day,@PIVOT(status, ['completed'], agg := 'COUNT') AS completed_orders,@PIVOT(status, ['cancelled'], agg := 'COUNT') AS cancelled_orders,@PIVOT(status, ['cancelled'], agg := 'COUNT') * 1.0 / NULLIF(@PIVOT(status, ['completed'], agg := 'COUNT'), 0) AS cancellation_rate
FROM rides
GROUP BY 1

2. @DEDUPLICATE:高效去重

功能概述

@DEDUPLICATE 使用窗口函数 ROW_NUMBER() 对数据进行去重,适用于需要保留每组最新/最旧记录的场景。

参数说明

参数说明示例
relation表名或 CTEmy_table
partition_by分区列[id, event_date]
order_by排序条件['event_date DESC', 'status ASC']

示例

假设 my_table 存储用户事件日志,我们希望保留每个用户每天的最新记录:

SQLMesh 宏写法
WITH raw_data AS (@DEDUPLICATE(my_table, [id, CAST(event_date AS DATE)], ['event_date DESC', 'status ASC'])
)
SELECT * FROM raw_data
渲染后的 SQL
WITH "raw_data" AS (SELECT *FROM "my_table" AS "my_table"QUALIFY ROW_NUMBER() OVER (PARTITION BY "id", CAST("event_date" AS DATE) ORDER BY "event_date" DESC, "status" ASC) = 1
)
SELECT * FROM "raw_data" AS "raw_data"

3. @DATE_SPINE:生成日期范围表

功能概述

@DATE_SPINE 用于生成连续的日期序列,常用于时间序列分析、数据补全等场景。

参数说明

参数说明示例
datepart时间粒度(day, week, month'day'
start_date起始日期'2024-01-01'
end_date结束日期'2024-01-16'

示例

生成 2024 年 1 月 1 日至 1 月 16 日的日期表:

SQLMesh 宏写法
WITH discount_promotion_dates AS (@DATE_SPINE('day', '2024-01-01', '2024-01-16')
)
SELECT * FROM discount_promotion_dates
渲染后的 SQL(DuckDB)
WITH "discount_promotion_dates" AS (SELECT "_exploded"."date_day" AS "date_day"FROM UNNEST(CAST(GENERATE_SERIES(CAST('2024-01-01' AS DATE), CAST('2024-01-16' AS DATE), INTERVAL '1' DAY) AS DATE[])) AS "_exploded"("date_day")
)
SELECT "discount_promotion_dates"."date_day" AS "date_day"
FROM "discount_promotion_dates" AS "discount_promotion_dates"

4. @RESOLVE_TEMPLATE:动态表路径解析

功能概述

@RESOLVE_TEMPLATE 用于动态生成表路径,适用于云存储(如 S3)或引擎元数据管理。

参数说明

参数说明示例
template字符串模板's3://bucket/@{catalog_name}/@{schema_name}/@{table_name}'
mode返回类型(literaltableliteral

示例

在模型定义中动态指定存储路径:

SQLMesh 宏写法
MODEL (name datalake.landing.customers,physical_properties (location = @resolve_template('s3://warehouse-data/@{catalog_name}/prod/@{schema_name}/@{table_name}'))
)
渲染后的 SQL
-- 生成的表路径示例:
-- s3://warehouse-data/datalake/prod/sqlmesh__landing/landing__customers__2517971505

总结

SQLMesh 的内置宏极大提升了 SQL 查询的灵活性和可维护性:

  • @PIVOT 简化行列转换,适用于统计分析。
  • @DEDUPLICATE 高效去重,优化数据清洗流程。
  • @DATE_SPINE 自动生成日期序列,简化时间序列分析。
  • @RESOLVE_TEMPLATE 动态解析表路径,适配云存储场景。

掌握这些宏的使用方法,可以显著提升 SQL 开发效率,减少重复代码。建议在实际项目中结合业务需求灵活运用! 🚀

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

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

相关文章

基于Springboot + vue3实现的工商局商家管理系统

项目描述 本系统包含管理员、商家两个角色。 管理员角色&#xff1a; 用户管理&#xff1a;管理系统中所有用户的信息&#xff0c;包括添加、删除和修改用户。 许可证申请管理&#xff1a;管理商家的许可证申请&#xff0c;包括搜索、修改或删除许可证申请。 许可证审批管理…

第五部分:第五节 - Express 路由与中间件进阶:厨房的分工与异常处理

随着你的 Express 应用变得越来越大&#xff0c;所有的路由和中间件都写在一个文件里会变得难以管理。这时候就需要将代码进行拆分和组织。此外&#xff0c;一个健壮的后端应用必须能够优雅地处理错误和一些常见的 Web 开发问题&#xff0c;比如跨域。 路由模块化 (express.Ro…

萌新联赛第(三)场

C题 这道题用暴力去写想都不要想&#xff0c;一定超时&#xff0c;于是我们需要优化&#xff0c;下面是思路过程&#xff1a; 如图&#xff0c;本题只需找到x的因数个数和(n-x)的因数个数&#xff0c;这两个相乘&#xff0c;得到的就是对于这个x来说组合的个数&#xff0c;且x…

【Android构建系统】如何在Camera Hal的Android.bp中选择性引用某个模块

背景描述 本篇文章是一个Android.bp中选择性引用某个模块的实例。 如果是Android.mk编译时期&#xff0c;在编译阶段通过某个条件判断是不是引用某个模块A, 是比较好实现的。Android15使用Android.bp构建后&#xff0c;要想在Android.bp中通过自定义的一个变量或者条件实现选…

【OneNET】_01_使用微信小程序通过新版OneNET平台获取STM32设备信息并进行控制

【OneNET】_01_使用微信小程序通过新版OneNET平台获取STM32设备信息并进行控制 一、 前言1.1 OntNET硬件方面: STM32F103C8T6 ESP01S教程 1.2 微信小程序方面 二、STM32代码部分修改三、微信小程序修改的部分四、小笔记&#xff08;个人杂记&#xff09;4.1 OneNETOneNET物联网…

用 python 编写的一个图片自动分类小程序(三)

图片自动分类识别小程序记录 2025/5/18 0:38修改程序界面&#xff0c;增加一些功能 用 python 编写的一个图片自动识别分类小程序。 操作系统平台&#xff1a;Microsoft Windows 11 编程语言和 IDE&#xff1a;python 3.10 Visual studio code 一&#xff1a;图片自动分…

嵌入式硬件篇---SGP30 气体传感器

文章目录 前言一、SGP30 气体传感器详解(一)基本概述(二)工作原理传感器结构检测机制自校准功能(三)主要特性(四)应用场景智能家居空气质量检测仪汽车行业商业建筑二、TVOC 与 eCO2 的含义(一)TVOC(总挥发性有机化合物)定义危害健康标准(二)eCO2(等效二氧化碳)…

【原创】ubuntu22.04下载编译AOSP 15

安装依赖的库&#xff0c;顺便把vim 也安装一下 sudo apt-get install vim sudo apt-get install git gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip font…

防止勒索病毒的兜底方案——备份

勒索病毒入侵会对您的业务数据进行加密勒索&#xff0c;导致业务中断、数据泄露、数据丢失等&#xff0c;从而带来严重的业务风险。 防止勒索病毒有三个方向&#xff1a; 1&#xff09;实时防御已知勒索病毒 各个云厂商的云安全中心实现了对大量已知勒索病毒的实时防御。在服务…

es在已有历史数据的文档新增加字段操作

新增字段设置默认值 场景 在已经有大量数据的索引文档上&#xff0c;增加新字段 技术实现 一.更新索引映射 通过PUT请求显式定义新字段类型&#xff0c;确保后续写入的文档能被正确解析 PUT /文档名/_mapping {"properties": {"字段名1": {"type…

留给王小川的时间不多了

王小川&#xff0c;这位头顶“天才少年”光环的清华学霸、搜狗输入法创始人、中国互联网初代技术偶像&#xff0c;正迎来人生中最难啃的硬骨头。 他在2023年创立的百川智能&#xff0c;被称为“大模型六小虎”之一。今年4月&#xff0c;王小川在全员信中罕见地反思过去两年工作…

深入掌握MyBatis:连接池、动态SQL、多表查询与缓存

文章目录 一、MyBatis连接池1.1 连接池的作用1.2 MyBatis连接池分类 二、动态SQL2.1 if标签2.2 where标签2.3 foreach标签2.4 SQL片段复用 三、多表查询3.1 多对一查询&#xff08;一对一&#xff09;3.2 一对多查询 四、延迟加载4.1 立即加载 vs 延迟加载4.2 配置延迟加载 五、…

TDesign AI Chat - Vue3.x 可用!腾讯出品的 AIGC 交互对话组件,免费开源、包含设计资源

各位前端开发者有遇到做 AI Chat 项目的聊天交互界面需求了吗&#xff1f;TDesign 出品的这个组件很不错&#xff0c;推荐给大家。 TDesign AI Chat 是 TDesign 为 AIGC 场景开发的 UI 系列组件中的一部分&#xff0c;主要用于开发目前非常流行的 ChatBot 对话交互场景。最近 …

spring -MVC-02

SpringMVC-11 - 响应 在 SpringMVC 中&#xff0c;响应是服务器对客户端请求的反馈&#xff0c;它可以以多种形式呈现&#xff0c;包括视图名称、ModelAndView 对象、JSON 数据以及重定向等。以下是对 SpringMVC 中不同响应类型的详细介绍&#xff1a; 1. 视图名称 通过返回…

老旧设备升级利器:Modbus TCP转 Profinet让能效监控更智能

在工业自动化领域&#xff0c;ModbusTCP和Profinet是两种常见的通讯协议。Profinet是西门子公司推出的基于以太网的实时工业以太网标准&#xff0c;而Modbus则是由施耐德电气提出的全球首个真正开放的、应用于电子控制器上的现场总线协议。这两种协议各有各的优点&#xff0c;但…

ubuntu下docker安装mongodb-支持单副本集

1.mogodb支持事务的前提 1) MongoDB 版本&#xff1a;确保 MongoDB 版本大于或等于 4.0&#xff0c;因为事务支持是在 4.0 版本中引入的。 2) 副本集配置&#xff1a;MongoDB 必须以副本集&#xff08;Replica Set&#xff09;模式运行&#xff0c;即使是单节点副本集&#x…

【前端开发】Uniapp日期时间选择器:实现分钟动态步长设置

技术栈 Uniapp + Vue3 + uView年份显示前后一年,分钟动态设置间隔效果图 主体显示<view class="uni-row-between selector"><view class="uni-flex-1 left" @click="!props.disabled && openPicker()"><uni-iconscolor=…

iOS 蓝牙开发中的 BT 与 BLE

在 iOS 开发者的语境里&#xff0c;大家把 BT 和 BLE 当成两种不同的蓝牙技术在谈——它们来自同一个 Bluetooth 规范&#xff0c;但面向的场景、协议栈乃至 Apple 提供的 API 都截然不同。 缩写全称 / 技术名称规范层叫法iOS 支持现状典型用途BTBluetooth Classic&#xff08…

Flink CEP是什么?

Apache Flink 的 CEP&#xff08;Complex Event Processing&#xff0c;复杂事件处理&#xff09; 是 Flink 提供的一个库&#xff0c;用于在无界数据流中检测符合特定模式的事件组合。 &#x1f3af; 一、什么是 CEP&#xff1f; ✅ 定义&#xff1a; CEP 是一种从连续的数据…

ARM (Attention Refinement Module)

ARM模块【来源于BiSeNet】&#xff1a;细化特征图的注意力&#xff0c;增强重要特征并抑制不重要的特征。 Attention Refinement Module (ARM) 详解 ARM (Attention Refinement Module) 是 BiSeNet 中用于增强特征表示的关键模块&#xff0c;它通过注意力机制来细化特征图&…