如何用SQL实现多值选取并保留同组较大值的查询
分组合并标签并保留最大值的SQL实现
核心思路是先将需要合并的标签归类到同一分组,再对每个分组取Value的最大值。以下分场景给出实现方案:
场景1:所有带-的标签均按-前的前缀合并
比如A3-1、A3-2合并为A3,若有B2-1也会合并为B2,不同数据库的实现如下:
MySQL / MariaDB
SELECT SUBSTRING_INDEX(TagName, '-', 1) AS GroupedTagName, MAX(Value) AS MaxValue FROM your_table_name GROUP BY SUBSTRING_INDEX(TagName, '-', 1);
SUBSTRING_INDEX会将TagName按-分割,取第一个部分作为分组依据,自动将同前缀的标签归为一组。
SQL Server
SELECT CASE WHEN CHARINDEX('-', TagName) > 0 THEN LEFT(TagName, CHARINDEX('-', TagName) - 1) ELSE TagName END AS GroupedTagName, MAX(Value) AS MaxValue FROM your_table_name GROUP BY CASE WHEN CHARINDEX('-', TagName) > 0 THEN LEFT(TagName, CHARINDEX('-', TagName) - 1) ELSE TagName END;
通过CHARINDEX判断是否包含-,存在则截取左侧部分作为分组键,否则保留原标签。
PostgreSQL
SELECT SPLIT_PART(TagName, '-', 1) AS GroupedTagName, MAX(Value) AS MaxValue FROM your_table_name GROUP BY SPLIT_PART(TagName, '-', 1);
SPLIT_PART按-分割字符串并取第一部分,实现同前缀标签的分组。
场景2:仅特定标签需要合并(如仅A3-1、A3-2)
如果只有指定标签需要合并,其他带-的标签保持原样,用CASE语句精准控制分组:
SELECT CASE WHEN TagName IN ('A3-1', 'A3-2') THEN 'A3' ELSE TagName END AS GroupedTagName, MAX(Value) AS MaxValue FROM your_table_name GROUP BY CASE WHEN TagName IN ('A3-1', 'A3-2') THEN 'A3' ELSE TagName END;
这种方式不会影响其他标签的原有分组逻辑,仅对目标标签合并取最大值。
内容的提问来源于stack exchange,提问作者Murf
相关产品推荐
相关产品推荐

