TDengine 字符串函数 GROUP_CONCAT 用户手册 - 实践

news/2026/1/21 19:00:23/文章来源:https://www.cnblogs.com/yangykaifa/p/19513718

在这里插入图片描述

GROUP_CONCAT 函数用户手册

1. 函数概述

1.1 功能说明

GROUP_CONCAT 函数是一个聚合函数,用于将分组中的多行字符串值连接成一个字符串。它在需要将分组数据汇总为单个字符串表示时非常有用,例如将同一电表在不同时间点的状态信息合并展示。

核心特点

  • 属于聚合函数,配合 GROUP BY 使用
  • 支持多列字段连接
  • 支持自定义分隔符
  • 自动跳过 NULL 值

1.2 语法

GROUP_CONCAT(expr1 [, expr2, ..., exprN, separator])

1.3 参数说明

参数类型说明是否必需
expr1, expr2, …VARCHAR/NCHAR要连接的字符串字段或表达式必需(至少1个)
separatorVARCHAR/NCHAR分隔符,作为最后一个参数必需

1.4 返回值

1.5 适用版本

自 TDengine v3.3.8.0 开始支持

1.6 适用范围

2. GROUP_CONCAT 与 CONCAT 的区别

2.1 核心差异对比

对比项GROUP_CONCATCONCAT
函数类型聚合函数(Aggregate)标量函数(Scalar)
作用范围多行数据 → 单个结果单行数据 → 单个结果
使用场景分组汇总,将多行合并行内字段拼接
GROUP BY通常配合使用不需要
NULL 处理自动跳过 NULL 值任何参数为 NULL 则返回 NULL
参数个数至少2个(字段+分隔符)2-8个
分隔符最后一个参数作为分隔符无分隔符(CONCAT_WS 支持)

2.2 示例对比

CONCAT - 单行字段拼接
-- 拼接单行的多个字段
SELECT CONCAT(location, '-', tbname) AS device_info
FROM meters
LIMIT 1;
-- 输出:
-- device_info
-- ===================
-- Beijing.Chaoyang-d1001
GROUP_CONCAT - 多行数据聚合
-- 将同一位置的所有电表名连接起来
SELECT
location,
GROUP_CONCAT(tbname, ',') AS all_meters
FROM meters
GROUP BY location;
-- 输出:
-- location          | all_meters
-- =======================================
-- Beijing.Chaoyang  | d1001,d1002,d1003
-- Beijing.Haidian   | d2001,d2002

2.3 适用场景选择

场景推荐函数说明
单行多列拼接CONCAT如:姓+名、城市+区域
多行汇总GROUP_CONCAT如:同组数据合并显示
需要分隔符的单行拼接CONCAT_WS带分隔符的 CONCAT
需要分隔符的多行汇总GROUP_CONCAT带分隔符的聚合

3. 基础使用示例

3.1 智能电表表结构

-- 创建智能电表超级表
CREATE STABLE meters (
ts TIMESTAMP,
current FLOAT,
voltage INT,
phase FLOAT
) TAGS (
groupid INT,
location VARCHAR(64)
);
-- 创建子表
CREATE TABLE d1001 USING meters TAGS (1, 'Beijing.Chaoyang');
CREATE TABLE d1002 USING meters TAGS (1, 'Beijing.Chaoyang');
CREATE TABLE d1003 USING meters TAGS (1, 'Beijing.Haidian');
CREATE TABLE d1004 USING meters TAGS (2, 'Shanghai.Pudong');
-- 插入测试数据
INSERT INTO d1001 VALUES
('2024-01-15 00:00:00', 10.2, 220, 0.95),
('2024-01-15 12:00:00', 15.8, 219, 0.94);
INSERT INTO d1002 VALUES
('2024-01-15 00:00:00', 9.8, 221, 0.96),
('2024-01-15 12:00:00', 14.5, 220, 0.95);

3.2 简单字符串连接

-- 连接两个字符串字段
SELECT GROUP_CONCAT(location, tbname, '-') AS device_list
FROM (
SELECT DISTINCT location, tbname FROM meters LIMIT 3
);

预期输出

 device_list                              |
===========================================Beijing.Chaoyangd1001-Beijing.Chaoyangd1002-Beijing.Haiدياند1003 |

3.3 配合 GROUP BY 使用

-- 按区域分组,列出每个区域的所有电表
SELECT
SUBSTRING_INDEX(location, '.', 1) AS city,
GROUP_CONCAT(tbname, ',') AS meter_list,
COUNT(*) AS meter_count
FROM meters
GROUP BY city;

预期输出

 city     | meter_list           | meter_count |
====================================================Beijing  | d1001,d1002,d1003    | 3           |Shanghai | d1004                | 1           |

4. 智能电表应用场景

场景 1:按区域汇总电表设备清单

业务需求:运维人员需要快速查看每个区域部署了哪些电表设备。

-- 按位置分组,列出所有电表编号
SELECT
location,
COUNT(*) AS total_meters,
GROUP_CONCAT(tbname, ', ') AS meter_ids
FROM meters
GROUP BY location
ORDER BY total_meters DESC;

预期输出

 location          | total_meters | meter_ids        |
========================================================Beijing.Chaoyang  | 2            | d1001, d1002     |Beijing.Haidian   | 1            | d1003            |Shanghai.Pudong   | 1            | d1004            |

业务价值

  • 快速了解设备分布情况
  • 便于运维人员制定巡检计划
  • 支持设备清单导出

场景 2:多维度数据展示

业务需求:将电表的多个状态信息合并为一条记录便于展示。

-- 将电表的关键指标连接成摘要信息
SELECT
tbname,
location,
GROUP_CONCAT(
CONCAT(
TO_CHAR(ts, 'HH24:MI'),
':',
CAST(current AS VARCHAR),
'A'
),
' | '
) AS hourly_current_summary
FROM meters
WHERE ts >= '2024-01-15 00:00:00'
AND ts < '2024-01-15 06:00:00'
GROUP BY tbname, location
LIMIT 3;

预期输出

 tbname | location          | hourly_current_summary        |
==================================================================d1001  | Beijing.Chaoyang  | 00:00:10.2A | 12:00:15.8A   |d1002  | Beijing.Chaoyang  | 00:00:9.8A | 12:00:14.5A    |

业务价值

  • 紧凑的数据展示
  • 便于移动端查看
  • 减少数据传输量

5. 与其他数据库的兼容性

5.1 MySQL 中的 GROUP_CONCAT

MySQL 原生支持GROUP_CONCAT 函数,是该函数的标准实现。

MySQL 语法
GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[SEPARATOR str_val])
MySQL 特有功能
  1. DISTINCT 去重
-- MySQL 支持
SELECT dept, GROUP_CONCAT(DISTINCT name SEPARATOR ', ')
FROM employees
GROUP BY dept;
  1. ORDER BY 排序
-- MySQL 支持
SELECT dept, GROUP_CONCAT(name ORDER BY salary DESC SEPARATOR ', ')
FROM employees
GROUP BY dept;
  1. 自定义分隔符(可选)
-- MySQL 分隔符可选,默认为逗号
SELECT GROUP_CONCAT(name SEPARATOR ' | ') FROM users;
SELECT GROUP_CONCAT(name) FROM users;  -- 默认用逗号
  1. 长度限制
  • group_concat_max_len 系统变量控制
  • 默认 1024 字节,可动态调整
SET SESSION group_concat_max_len = 10000;
MySQL 示例
-- MySQL 完整示例
SELECT
department,
GROUP_CONCAT(
DISTINCT employee_name
ORDER BY salary DESC
SEPARATOR ' | '
) AS top_employees
FROM employees
WHERE salary > 5000
GROUP BY department;

5.2 PostgreSQL 中的 STRING_AGG

PostgreSQL 不支持GROUP_CONCAT,但提供了功能相似的 STRING_AGG 函数(SQL标准函数)。

PostgreSQL 语法
STRING_AGG(expression, delimiter [ORDER BY ...])
PostgreSQL 特点
  1. 必须指定分隔符
-- PostgreSQL (9.0+)
SELECT dept, STRING_AGG(name, ', ' ORDER BY name)
FROM employees
GROUP BY dept;
  1. 支持 ORDER BY
SELECT STRING_AGG(name, ', ' ORDER BY salary DESC)
FROM employees;
  1. 支持 DISTINCT(PostgreSQL 9.0+)
SELECT STRING_AGG(DISTINCT city, ', ')
FROM customers;
  1. 无长度限制(除了内存限制)
PostgreSQL 替代方案
-- 使用 ARRAY_AGG + ARRAY_TO_STRING
SELECT ARRAY_TO_STRING(ARRAY_AGG(name ORDER BY name), ', ')
FROM employees;

5.3 TDengine vs MySQL vs PostgreSQL

特性TDengineMySQLPostgreSQL
函数名GROUP_CONCATGROUP_CONCATSTRING_AGG
分隔符必需(最后参数)可选(SEPARATOR)必需
DISTINCT❌ 不支持✅ 支持✅ 支持
ORDER BY❌ 不支持✅ 支持✅ 支持
长度限制TSDB_MAX_FIELD_LENgroup_concat_max_len无限制
版本v3.3.8.0+原生支持9.0+ (STRING_AGG)
NULL 处理跳过跳过跳过
多列连接✅ 支持✅ 支持❌ 单列(需嵌套)

5.4 跨数据库迁移建议

从 MySQL 迁移到 TDengine
-- MySQL 原始查询
SELECT GROUP_CONCAT(DISTINCT name ORDER BY name SEPARATOR '|')
FROM users;
-- TDengine 等效查询(需要调整)
SELECT GROUP_CONCAT(name, '|')
FROM (SELECT DISTINCT name FROM users ORDER BY name);

注意事项

  • ❌ TDengine 不支持 DISTINCTORDER BY 子句
  • ✅ 需要通过子查询实现去重和排序
  • ✅ 分隔符位置不同(TDengine 在最后)
从 PostgreSQL 迁移到 TDengine
-- PostgreSQL 原始查询
SELECT STRING_AGG(name, ', ' ORDER BY name)
FROM users;
-- TDengine 等效查询
SELECT GROUP_CONCAT(name, ', ')
FROM (SELECT name FROM users ORDER BY name);

注意事项

  • ✅ 函数名不同但语义相似
  • ✅ 分隔符参数位置调整
  • ✅ 排序需通过子查询实现

6. 使用注意事项

6.1 NULL 值处理

-- NULL 值会被自动跳过
CREATE TABLE test_null (ts TIMESTAMP, name VARCHAR(20));
INSERT INTO test_null VALUES
('2024-01-01 00:00:00', 'A'),
('2024-01-01 00:00:01', NULL),
('2024-01-01 00:00:02', 'B');
SELECT GROUP_CONCAT(name, ',') FROM test_null;
-- 输出:A,B (NULL 被跳过)

6.2 去重需要使用子查询

-- ❌ 错误:TDengine 不支持 DISTINCT 直接用在 GROUP_CONCAT 中
SELECT GROUP_CONCAT(DISTINCT location, ',') FROM meters;
-- ✅ 正确:通过子查询去重
SELECT GROUP_CONCAT(location, ',')
FROM (SELECT DISTINCT location FROM meters);

6.3 字符集处理

-- 自动处理 NCHAR 和 VARCHAR 混合
SELECT GROUP_CONCAT(varchar_col, nchar_col, '-')
FROM mixed_charset_table;
-- 会自动进行字符集转换

6.4 结果长度限制

-- 注意:结果字符串不能超过 TSDB_MAX_FIELD_LEN
-- 对于大量数据,可能需要分批处理或使用 LIMIT
SELECT
location,
GROUP_CONCAT(tbname, ',') AS meters
FROM meters
GROUP BY location
HAVING COUNT(*) < 1000;  -- 避免结果过长

6.5 分隔符必需性

-- ❌ 错误:缺少分隔符
SELECT GROUP_CONCAT(name) FROM users;
-- ✅ 正确:必须提供分隔符
SELECT GROUP_CONCAT(name, ',') FROM users;

7. 性能优化建议

7.1 限制分组大小

-- ✅ 推荐:对大表使用 WHERE 过滤
SELECT
location,
GROUP_CONCAT(tbname, ',') AS meters
FROM meters
WHERE ts >= NOW - 1d  -- 限制时间范围
GROUP BY location;

7.2 避免过大的结果集

-- ✅ 使用 HAVING 限制组大小
SELECT
location,
GROUP_CONCAT(tbname, ',') AS meters
FROM meters
GROUP BY location
HAVING COUNT(*) <= 100;  -- 限制每组记录数

7.3 合理使用子查询

-- ✅ 先过滤再聚合
SELECT
location,
GROUP_CONCAT(tbname, '|') AS active_meters
FROM (
SELECT DISTINCT location, tbname
FROM meters
WHERE groupid = 1
LIMIT 1000
)
GROUP BY location;

8. 常见问题 FAQ

Q1: GROUP_CONCAT 和 CONCAT 有什么区别?

A:

Q2: 如何实现 MySQL 的 DISTINCT 和 ORDER BY 功能?

A: 通过子查询实现:

-- 去重 + 排序
SELECT GROUP_CONCAT(name, ',')
FROM (
SELECT DISTINCT name
FROM users
ORDER BY name
);

Q3: 分隔符可以省略吗?

A: 不可以。TDengine 的 GROUP_CONCAT必须提供分隔符作为最后一个参数,这与 MySQL 不同。

Q4: 如何处理结果字符串过长的情况?

A:

  1. 使用 LIMIT 限制输入行数
  2. 使用 HAVING 过滤大组
  3. 缩短分隔符长度
  4. 分批查询

Q5: 能否连接数值类型字段?

A: 需要先转换为字符串类型:

SELECT GROUP_CONCAT(CAST(id AS VARCHAR), ',')
FROM users;

Q6: COUNT(DISTINCT …) 不支持怎么办?

A: 使用子查询实现:

-- ❌ 不支持
SELECT COUNT(DISTINCT tbname) FROM meters;
-- ✅ 使用子查询
SELECT COUNT(*) FROM (SELECT DISTINCT tbname FROM meters);

Q7: PostgreSQL 用户如何适应 TDengine?

A:

  • STRING_AGG 改为 GROUP_CONCAT
  • 分隔符参数移到最后
  • 通过子查询实现排序

Q8: 空字符串和 NULL 有什么区别?

A:

Q9: 可以连接多少个字段?

A: 理论上没有字段数量限制,但要注意:

  • 总结果长度不能超过 TSDB_MAX_FIELD_LEN
  • 字段越多,性能可能下降

9. 相关函数

函数类型说明关系
CONCAT标量函数单行多列拼接行级操作,不聚合
CONCAT_WS标量函数带分隔符的单行拼接类似 CONCAT
GROUP_CONCAT聚合函数多行汇总连接分组聚合
STRING_AGG聚合函数(PG)PostgreSQL 等效函数功能相似

文档版本:v3.3.8.0
最后更新:2024-01-15
适用场景:智能电表数据分析、设备清单汇总、多行数据展示

重要提示

关于 TDengine

TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。

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

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

相关文章

亚马逊、敦煌网商家突围必备!自养号测评补单提升店铺排名销量秘籍

在跨境电商领域&#xff0c;otto、wayfair、亚马逊、速卖通、阿里国际站、敦煌网、虾皮、lazada、美客多等平台已然成为众多卖家逐鹿的战场。在这些平台上&#xff0c;产品的排名与销量&#xff0c;就如同企业的生命线&#xff0c;直接决定着卖家在全球市场中的竞争力与盈利水平…

【强烈收藏】7天打造AI知识库:每天10分钟,把你的经历变成可复用的知识资产

这是一款7天知识库搭建打卡营&#xff0c;每天仅需10分钟&#xff0c;通过双线并行方式&#xff08;明线学工具&#xff0c;暗线显化经验&#xff09;&#xff0c;帮助知识工作者从零开始建立个人知识库系统。课程无需技术基础&#xff0c;强调"先完成再完美"原则&am…

十大防脱生发品牌排行榜评测,秋冬脱发严重,防脱育发液哪个牌子效果最好?

导语:脱发诱因包括营养失衡、精神压力或不当护发等。通过简单自测和日常调整,我们可逆转早期脱发,重拾自信风采。 观察每日掉发量‌:用宽齿梳梳头,收集掉落头发统计。正常每天脱落‌50-100根‌属生理范围。如果连…

【必看收藏】2023年RAG最新突破!12种前沿架构深度解析,让大模型不再胡说八道

文章介绍了12种最新的RAG高级架构与方法&#xff0c;包括Mindscape-Aware RAG、基于超图记忆的多步RAG、基于共现统计的动态RAG等。这些方法针对长文档处理、减少幻觉、多模态知识构建、安全防御等方面进行创新&#xff0c;每项研究均提供论文链接和部分代码链接&#xff0c;展…

深圳昊客网络|社媒外贸GEO外贸推广代运营公司/服务商:排名前十机构哪好点?

2026 年外贸出海竞争白热化,海外社媒 GEO 推广成为企业破局的关键。在深圳众多代运营机构中,排名前十的服务商各有特色,但真正能实现 “精准引流 + 高效转化” 的,往往离不开硬核技术支撑。其中,深圳昊客网络凭借…

止痒防脱洗发水怎么选?2026实测最有效榜单,国货黑马逆袭出圈

面对货架上琳琅满目的止痒防脱洗发水,不少人陷入选择困境:标注“强效止痒”的产品可能刺激头皮,主打“温和固发”的又见效缓慢;看似成分相似的单品,实际使用效果却天差地别。更令人困扰的是,多数人盲目跟风购买网…

2026年全网热议的活动搭建品牌推荐,帮你提升活动效果

在选择活动搭建服务时,了解几个知名公司的优势十分重要。一方面,青岛音象恒文化传媒有限公司以其杰出的舞美工程策划闻名于业内,提供高水准的设备和专业服务。另一方面,华彩则凭借其创新的设计和优质服务,在客户中…

c4d.python克隆体缓存操作 割草代码--支持事件回滚

import c4d from c4d import utilsdef GetClonerCache(cloner_obj, doc):# 强制更新文档缓存&#xff08;确保克隆体已计算&#xff09;doc.ExecutePasses(None, True, True, True, c4d.BUILDFLAGS_NONE)# 获取克隆对象的缓存根节点cache_root cloner_obj.GetCache()if cache_…

东瀛匠心・数智绿筑 2026:日本展台设计搭建的精密范本

开篇:日本展台搭建的匠心基因与合规使命 2026 年的日本会展业,正由两大核心事件重塑行业规则:9 月爱知・名古屋亚运会配套展会首次采用 “赛事 + 产业” 双展模式,带来 “轻量化搭建 + 文化展示” 的精准需求;1 月…

Arthas使用 - 倾听

1. Arthas 介绍 Arthas 是阿里巴巴开源的 Java 诊断工具,用于:实时监控线上应用(无需重启) 快速定位 CPU、内存、线程问题 分析方法执行耗时、参数、返回值 支持 JDK 6+(包括 JDK 21)✅ 核心优势:通过 JVM Atta…

2026年苏州昆山AI推广/geo优化公司/服务商哪家好?TOP5哪家好?看实战合规与本土适配

据苏州AI产业研究院2025年度《苏州GEO服务行业发展白皮书》显示,苏州TOB制造业及本地生活服务领域GEO服务渗透率达72.3%,其中合规性与本土产业适配能力成为企业选型首要考量,占比分别达81.2%、76.5%。伴随苏州装备制…

阿里上新 AI 平台「呜哩」,生图生视频免费开放!

今天发现一个新 AI 生图、生视频平台&#xff0c;阿里做的「呜哩 AI」。不多说&#xff0c;重点就是&#xff1a;现在用不要钱。免费用&#xff01;免费用&#xff01;免费用&#xff01;01.呜哩一下&#xff0c;让对话长出新世界呜哩&#xff08;Wuli&#xff09; 是阿里巴巴推…

大模型基础概念解析——优化

前言 大模型&#xff08;LLM&#xff09;正面临类似的挑战。一个拥有数百甚至数千亿参数的模型&#xff0c;其“原生态”存在几个核心痛点&#xff1a; 巨大的计算和内存开销&#xff1a;训练需要成千上万的GPU数月时间&#xff0c;推理&#xff08;使用&#xff09;时也需要昂…

Shiro反序列化漏洞一站式综合利用工具

工具介绍 ShiroExploit&#xff0c;是一款Shiro反序列化漏洞一站式综合利用工具。 工具功能 1、区分ShiroAttack2&#xff0c;采用分块传输内存马&#xff0c;每块大小不超过4000。 2、可打JDK高版本的shiro&#xff0c;确保有key、有gadget就能rce。 3、依托JavaChains动态…

day158—回溯—全排列(LeetCode-46)

题目描述 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; 输入&#x…

空气泵选购全指南:2026年市场、品牌与前瞻分析

空气泵,这个在实验室、医院、工厂乃至水产养殖中默默工作的设备,正经历着一场“静音革命”。走进一家现代化的环境监测实验室,您会发现,以往那些发出持续轰鸣的背景噪音源已悄然消失,取而代之的是运行声音轻柔如图…

2026年AI智能产品开发行业十大领先团队如何炼成

如何高效甄选AI智能产品开发服务商在数字化转型的浪潮中&#xff0c;AI智能产品开发已成为企业提升竞争力的关键。然而&#xff0c;面对市场上众多的服务商&#xff0c;如何选择一家靠谱、高效的合作伙伴&#xff1f;本文将从技术实力、行业案例和服务模式三个维度出发&#xf…

聚链成势:新紫光集团完成战略重构,书写科技自立新篇章

负债降低67%、连续三年营收超千亿、在超20个细分科技领域占据领先地位——这家曾经陷入破产重整的中国科技巨头,正以全新面貌重返产业舞台。2022年7月,紫光集团完成司法重整,引入智路资本和建广资产作为战略投资者,…

2026必备!9个一键生成论文工具,MBA论文写作必备!

2026必备&#xff01;9个一键生成论文工具&#xff0c;MBA论文写作必备&#xff01; AI 工具革新论文写作&#xff0c;MBA 人如何抓住先机&#xff1f; 在人工智能技术迅猛发展的今天&#xff0c;学术写作正经历一场深刻的变革。对于 MBA 学生而言&#xff0c;撰写高质量的论文…

科技赋能警校!itc保伦股份助力海南警察学院构建智慧教学新生态!

01铸魂扬帆,定海启航!海南警察学院,简称“海南警院”,是由海南省人民政府举办,海南省公安厅主管、海南省教育厅负责业务管理与指导的公办普通本科高等学校。学院坐落于海南省海口市秀英区定海大道1号,占地规模达…