You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL多值合并需求:同Num数据分组展示首末值及计数

解决方案

要实现该需求,可通过聚合计算结合UNION ALL生成每组的两行数据,具体实现如下:

核心思路

  1. 先按Num分组,计算每组的关键聚合值:最大Start number、最小Start number、最新Date start、最早Date start以及数据条数。
  2. 分别生成每组的首行(包含Num、最大值、最新日期、计数)和末行(包含最小值、最早日期,其余字段为空),再合并结果并排序保证每组两行相邻。

示例SQL语句

假设数据表名为data_table,以下代码适配多数主流SQL数据库:

WITH group_agg AS (
    SELECT
        Num,
        MAX(`Start number`) AS max_start_num,
        MIN(`Start number`) AS min_start_num,
        MAX(STR_TO_DATE(`Date start`, '%d.%m.%y')) AS latest_date,
        MIN(STR_TO_DATE(`Date start`, '%d.%m.%y')) AS earliest_date,
        COUNT(*) AS total_count
    FROM data_table
    GROUP BY Num
)
-- 生成每组首行数据
SELECT
    Num,
    max_start_num AS `Start number`,
    DATE_FORMAT(latest_date, '%d.%m.%y') AS `Date start`,
    total_count AS Count
FROM group_agg
UNION ALL
-- 生成每组末行数据
SELECT
    NULL AS Num,
    min_start_num AS `Start number`,
    DATE_FORMAT(earliest_date, '%d.%m.%y') AS `Date start`,
    NULL AS Count
FROM group_agg
-- 排序确保每组两行连续
ORDER BY Num, Count DESC;

关键说明

  • 日期处理:用STR_TO_DATE将字符串日期转为日期类型,确保MAX/MIN能正确识别日期先后,再用DATE_FORMAT转回原格式输出。不同数据库可替换对应函数:Oracle用TO_DATE/TO_CHAR,SQL Server用CONVERT。
  • 字段转义:因Start number和Date start含空格,需用反引号(MySQL)或方括号(SQL Server)包裹字段名。
  • 排序逻辑:通过ORDER BY Num, Count DESC让带计数的首行排在每组最前,空计数的末行紧随其后。

内容的提问来源于stack exchange,提问作者StimDoker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:25:20