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

请求协助合并不同行中的连续日期(附输入输出示例图)

合并多行连续日期的实现方案

以下提供两种常见场景下的实现方法,分别适用于数据库SQL查询和Python数据处理场景:

一、SQL 实现(适用于数据库数据)

利用窗口函数标记连续日期组,再聚合每组的起止日期:

WITH grouped_dates AS (
    SELECT 
        id,
        record_date,
        -- 标记连续日期组:与前一行日期差不为1天则新建组
        SUM(CASE WHEN DATEDIFF(record_date, LAG(record_date) OVER (PARTITION BY id ORDER BY record_date)) = 1 THEN 0 ELSE 1 END) 
        OVER (PARTITION BY id ORDER BY record_date) AS group_id
    FROM date_records
)
SELECT 
    id,
    MIN(record_date) AS start_date,
    MAX(record_date) AS end_date
FROM grouped_dates
GROUP BY id, group_id
ORDER BY id, start_date;

逻辑说明:

  • LAG(record_date) OVER (PARTITION BY id ORDER BY record_date):按id分组后,获取当前行的上一行日期
  • 通过DATEDIFF判断当前日期与上一行是否连续(差值为1天),累计生成唯一的group_id
  • 最后按id和group_id分组,取每组的最小/最大日期作为连续日期段的起止

二、Python Pandas 实现(适用于本地数据处理)

通过日期差标记连续组,再聚合得到结果:

import pandas as pd

# 假设输入数据已加载为DataFrame,示例结构:
# df = pd.DataFrame({
#     'id': [1,1,1,2,2],
#     'record_date': pd.to_datetime(['2024-01-01', '2024-01-02', '2024-01-04', '2024-02-10', '2024-02-11'])
# })

# 按分组键和日期排序
df = df.sort_values(['id', 'record_date'])

# 生成连续日期组标记
df['group_id'] = (df['record_date'] - df.groupby('id')['record_date'].shift(1)).dt.days.ne(1).cumsum()

# 聚合得到连续日期段
result = df.groupby(['id', 'group_id']).agg(
    start_date=('record_date', 'min'),
    end_date=('record_date', 'max')
).reset_index(drop=True).sort_values('id')

print(result)

逻辑说明:

  • 先按分组键(如id)和日期排序,确保日期顺序正确
  • shift(1)获取每组内上一行的日期,计算天数差后判断是否连续(ne(1)表示不等于1天)
  • cumsum()累计生成分组ID,最后聚合每组的起止日期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:05:25