Snowflake技术需求:按起止日期拆分记录为每日单条数据
按日期范围拆分单条记录为每日条目
以下是针对不同场景的实用解决方案:
方法1:SQL(以SQL Server为例)
通过递归CTE生成日期范围,关联原记录拆分出每日条目:
WITH DateRange AS ( -- 初始行:提取原记录的起始日期(仅保留日期部分) SELECT ID, Name, CAST(Start_date AS DATE) AS SplitDate, End_date FROM YourTable WHERE ID = '001' -- 定位要拆分的目标记录 UNION ALL -- 递归生成后续日期,直到达到结束日期 SELECT ID, Name, DATEADD(DAY, 1, SplitDate), End_date FROM DateRange WHERE SplitDate < CAST(End_date AS DATE) ) SELECT ID, Name, SplitDate AS Date FROM DateRange ORDER BY SplitDate OPTION (MAXRECURSION 0); -- 关闭递归次数限制,适配长日期范围
执行后会输出从2023-04-01到2023-06-30的所有每日记录,自动去除原日期的时分秒部分。
方法2:Python脚本(Pandas)
适合用Python处理本地数据的场景:
import pandas as pd # 原记录数据 original_data = { 'ID': ['001'], 'Name': ['Record1'], 'Start_date': ['2023-04-01 00:00:00.000'], 'End_date': ['2023-06-30 00:00:00.000'] } df = pd.DataFrame(original_data) # 转换日期格式,仅保留日期部分 df['Start_date'] = pd.to_datetime(df['Start_date']).dt.date df['End_date'] = pd.to_datetime(df['End_date']).dt.date # 定义拆分函数:为单条记录生成所有日期对应的条目 def expand_single_record(row): date_sequence = pd.date_range(start=row['Start_date'], end=row['End_date'], freq='D') return pd.DataFrame({ 'ID': [row['ID']] * len(date_sequence), 'Name': [row['Name']] * len(date_sequence), 'Date': date_sequence.date }) # 执行拆分并合并结果 split_result = pd.concat([expand_single_record(row) for _, row in df.iterrows()], ignore_index=True) # 验证输出(可选) print(split_result.head()) # 导出到CSV(可选) # split_result.to_csv('daily_records.csv', index=False)
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

