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

如何编写SQL查询,从给定表数据生成指定日期范围输出?

解决方案

问题回顾

现有表结构及数据如下:

cust_iddatesattendance_ind
A2022-01-151
A2022-02-151
A2022-03-150
A2022-04-151
A2022-05-150
B2022-01-150
B2022-02-151
B2022-03-151
B2022-04-151

需要按cust_id分组,提取attendance_ind=1的连续日期段,输出起始日期(月-日格式)和对应日期范围,目标输出:

cust_iddatedate range
Ajan-15jan-15 to feb-15
Aapr-15apr-15 to apr-15
Bfeb-15feb-15 to apr-15

通用SQL实现(兼容PostgreSQL/Oracle等)

WITH filtered_records AS (
    SELECT 
        cust_id,
        dates,
        TO_CHAR(dates, 'Mon-dd') AS formatted_date
    FROM your_table_name
    WHERE attendance_ind = 1
),
interval_groups AS (
    SELECT 
        cust_id,
        formatted_date,
        dates,
        -- 生成连续区间的分组标识:连续月份的该值保持一致
        ROW_NUMBER() OVER (PARTITION BY cust_id ORDER BY dates)
        - (EXTRACT(YEAR FROM dates)*12 + EXTRACT(MONTH FROM dates)) AS group_id
    FROM filtered_records
),
interval_summary AS (
    SELECT 
        cust_id,
        MIN(formatted_date) AS start_date,
        CONCAT(MIN(formatted_date), ' to ', MAX(formatted_date)) AS date_range
    FROM interval_groups
    GROUP BY cust_id, group_id
)
SELECT 
    cust_id,
    start_date AS "date",
    date_range
FROM interval_summary
ORDER BY cust_id, start_date;

MySQL 适配版本

WITH filtered_records AS (
    SELECT 
        cust_id,
        dates,
        DATE_FORMAT(dates, '%b-%d') AS formatted_date
    FROM your_table_name
    WHERE attendance_ind = 1
),
interval_groups AS (
    SELECT 
        cust_id,
        formatted_date,
        dates,
        ROW_NUMBER() OVER (PARTITION BY cust_id ORDER BY dates)
        - (YEAR(dates)*12 + MONTH(dates)) AS group_id
    FROM filtered_records
),
interval_summary AS (
    SELECT 
        cust_id,
        MIN(formatted_date) AS start_date,
        CONCAT(MIN(formatted_date), ' to ', MAX(formatted_date)) AS date_range
    FROM interval_groups
    GROUP BY cust_id, group_id
)
SELECT 
    cust_id,
    start_date AS `date`,
    date_range
FROM interval_summary
ORDER BY cust_id, start_date;

实现思路

  1. 过滤有效记录:先筛选出attendance_ind=1的行,同时将日期格式化为月-日形式。
  2. 生成连续区间分组:通过ROW_NUMBER()按用户分组排序,结合日期的年月数值计算分组ID——连续的月份中,该ID会保持相同,以此区分非连续的区间。
  3. 聚合区间信息:按用户和分组ID聚合,取每个区间的起始和结束格式化日期,拼接成日期范围。
  4. 输出结果:整理字段顺序并排序,得到目标格式的数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 20:38:13