SQL 分类
1. 主流的函数分类方法及其局限
目前市面上主流的函数分类方法是按照函数引用的字段类型进行划分的。
➊ 函数新分类:按计算上下文而非数据类型
➋ 行级vs聚合:明细计算与跨行聚合区分
➌ 表达式独立:通用计算纳入表达式体系
| CONCAT(a, b) 或 a | b PG | 拼接字符串。 例: 'Hi' | ' ' | 'World' |
|---|---|---|---|---|
| SUBSTRING(str, start, len) | 截取文本。 例: SUBSTRING('Data', 1, 2) -> 'Da' | |||
| SPLIT_PART(str, del, n) PG 常用 | 拆分取值,神器。 例: SPLIT_PART('a-b-c', '-', 2) -> 'b' | |||
| UPPER() / LOWER() | 转大写 / 转小写,常用于不区分大小写的比较。 | |||
| TRIM() / REPLACE() | 去空格 / 替换字符。清洗数据必备。 | |||
| LENGTH(str) | 返回字符串长度。 | |||
| CURRENT_DATE / NOW() | 获取今天的日期 / 当前的时间戳。 | |||
| DATE_TRUNC('part', date) BI核心 | 日期对齐/取整 (Day, Month, Year)。 例: DATE_TRUNC('month', now()) | |||
| EXTRACT(part FROM date) | 提取数字部分 (如 Year, Month)。 例: EXTRACT(YEAR FROM now()) | |||
| AGE(timestamp, timestamp) | 计算时间差。 例: AGE('2025-01-01', '2020-01-01') | |||
| date + interval '1 day' PG | 日期加减运算。 例: now() - interval '1 week' | |||
| COALESCE(v1, v2, ...) 必会 | 返回第一个非空值。处理 NULL 的首选。 例: COALESCE(null, 0) -> 0 | |||
| NULLIF(v1, v2) | 如果 v1=v2 返回 NULL,否则返回 v1。 常用于避免除以0: a / NULLIF(b,0) |
CASE WHEN condition THEN result ELSE end 强大的 IF-THEN 逻辑。BI 中创建"计算字段"的基础。
| ROUND(num, decimals) | 四舍五入。 例: ROUND(3.14159, 2) -> 3.14 |
|---|---|
| FLOOR() / CEIL() | 向下取整 / 向上取整。 |
| CAST(val AS type) | 标准类型转换。 |
| value::type PG极简 | Postgres 特有转换符。 例: '100'::integer , order_date::text |
📊 聚合函数 (多行变一行)
聚合函数 (多行变一行)
| COUNT(*) / COUNT(col) | 计数 (包含NULL / 不含NULL)。 |
|---|---|
| SUM() / AVG() | 求和 / 求平均值。 |
| MIN() / MAX() | 最小值 / 最大值。 |
| STRING_AGG(col, del) PG | 文本聚合。 例: STRING_AGG(name, ', ') |
📊 窗口函数 & JSON (上下文与结构)
窗口函数 & JSON (上下文与结构)
| ROW_NUMBER() OVER() | 生成唯一行号。 |
|---|---|
| RANK() OVER() | 排名 (允许并列,名次跳跃)。 |
| LAG(col) / LEAD(col) | 访问前一行 / 后一行数据 (做同比环比)。 |
| json_col ->> 'key' JSON | 提取 JSON 字段为文本。 |
2. 个人推荐的分类思路:基于计算的性质
您个人推荐的分类思路是按照计算的性质,即函数计算所处的环境或上下文(Context),也就是其完成计算的详细级别来划分。
通过这种方式,您可以将函数分为两个最核心的类别:
行级别计算的特点是:计算是一行一行(Row by Row)完成的。计算结果绝不会跨行出现。
聚合函数与行级别函数不同,其计算必然跨行。
3. 通用计算(Expression)的定位
为了使函数分类体系更加清晰,您将既可以在明细行上做,也可以在聚合之后做的通用计算,独立出来放到了表达式(Expression)体系中。
通过将这些不限定引用类型或涉及上下文判断的复杂计算归入“表达式”中(例如 Tableau 中的 Fixed LOD 和 PowerBI 中的 Calculate),您的核心函数分类就清晰地聚焦在“在明细上完成”或“为聚合而处理”的计算上。
总结来说,您的函数分类思路是从传统的面向数据类型,升级到面向计算上下文(或详细级别)的高级分析框架。
这就像将一个图书馆的图书不再仅仅按“纸张类型”分类(如硬皮书、软皮书),而是按“读者使用场景”分类(如在阅览室借阅的、可带回家的),从而提供了一个更贴合分析需求和计算环境的体系。
📖 相关文章
● SQL 别裁新解:PostgreSQL函数分类速查表
● 基于RFM模型与Tableau Prep NTILE函数的旅客价值分层实现
● 8.1 计算的演进及分类:从Excel、SQL到Tableau
● 用Tableau画改进版幂函数柱状图
● Tableau计算回流客户:参数筛选 vs 表关联,哪个更高效?
——————————————————————————————
No comments yet