iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >SQL实现时间序列错位还原案列
  • 295
分享到

SQL实现时间序列错位还原案列

2024-04-02 19:04:59 295人浏览 安东尼
摘要

目录一、需求描述二、思路概述1 需求延展2 思路概述 三、sql代码一、需求描述 1 原表T1某条记录(记做r1,相邻下一条为r2)的下一行记录的STARTDATE小于上一行END

一、需求描述

1 原表T1某条记录(记做r1,相邻下一条为r2)的下一行记录的STARTDATE小于上一行ENDDATE,针对这样的记录做转换即:

r1STARTDATE保持不变,ENDDATE为r1STARTDATE-1

r2STARTDATE为r1的ENDDATEENDDATE为r1ENDDATE

2 如果原表T1不存在相邻行“时间重叠”(即为1的定义)时保持原有数据不变。


 # 文本版
#T1
seq id  startdate   enddate     num
1 1 2021-04-20 2021-05-03 200
2 1 2021-05-01 2021-05-24 100
3 1 2021-05-18 2021-05-31 69
4 1 2021-05-20 2021-07-31 34
5 1 2021-08-05 2021-08-25 45
6 1 2021-08-15 2021-09-25 65
 
 
#输出结果
ID STARTDATE    ENDDATE     NUM
1  2021-04-20 2021-04-30 200
1  2021-05-01 2021-05-02 300
1  2021-05-03 2021-05-17 100
1  2021-05-18 2021-05-19 169
1  2021-05-20 2021-05-23 203
1  2021-05-24 2021-05-30 103
1  2021-05-31 2021-07-30 34
1  2021-08-05 2021-08-14 45
1  2021-08-15 2021-08-25 110
1  2021-08-26 2021-09-25 65
 
 

二、思路概述

1 需求延展


SEQ     ID      STARTDATE       ENDDATE         NUM
1 1 2021-04-20 2021-05-03 200
2 1 2021-05-01 2021-05-24 100
3 1 2021-05-18 2021-05-31 69
4 1 2021-05-20 2021-07-31 34


这里第4条记录同时叠加在第2和3条记录里。

2 思路概述

1) T0 通过上下行函数生成的时间序列


id      new_DATE        nextSTARTDATE   preEndDATE     rn      
1 2021-05-24          2021-05-03 1
1 2021-05-03 2021-05-24 2021-05-01 2
1 2021-05-01 2021-05-03 2021-04-20 3
1 2021-04-20 2021-05-01          4


2) last 取出T0里的最后一条记录,为后面的矫正做准备。


new_Date        preENDDATE      id
2021-05-24 2021-05-03 1


3) nORMal 取出原始数据里不会出现时间叠加的记录,为后面的矫正做准备。
当前演示数据无记录,代码加注释可浮现。

4)T_Serial 统一定义STARTDATE、ENDDATE,首次修正T0。


id      STARTDATE       ENDDATE
1 2021-04-20 2021-04-30
1 2021-05-01 2021-05-03
1 2021-05-04 2021-05-24


 5) T2 对时间没有重叠的记录进行修正(删除T0对应值,更新对应ENDDATE)。
当前示例结果集为空,即无需要修正。

6) T2关联T1(原始表),汇总后取得最终值


STARTDATE   ENDDATE     NUM
2021-04-20 2021-04-30 200
2021-05-01 2021-05-03 300
2021-05-04 2021-05-24 100

三、SQL代码

当前演示版本是Mysql 8.0.23,支持CTE、窗口函数的SQL Serveroracle需要修改Order byADDDATE处语法。
Step0 创建表并初始化数据


DROP TABLE IF EXISTS test_ShenLiang2025;
CREATE TABLE test_ShenLiang2025 (
  seq int DEFAULT NULL,
  id int DEFAULT NULL,
  STARTDATE date DEFAULT NULL,
  ENDDATE date DEFAULT NULL,
  NUM int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
INSERT INTO test_ShenLiang2025 VALUES ('1', '1', '2021-04-20', '2021-05-03', '200');
INSERT INTO test_ShenLiang2025 VALUES ('2', '1', '2021-05-01', '2021-05-24', '100');
INSERT INTO test_ShenLiang2025 VALUES ('3', '1', '2021-05-18', '2021-05-31', '69');
INSERT INTO test_ShenLiang2025 VALUES ('4', '1', '2021-05-20', '2021-07-31', '34');
INSERT INTO test_ShenLiang2025 VALUES ('5', '1', '2021-08-05', '2021-08-25', '45');
INSERT INTO test_ShenLiang2025 VALUES ('6', '1', '2021-08-15', '2021-09-25', '65');
 


Step1 构建临时结果集以生成时间序列。


WITH T0 AS(
SELECT id, 
   new_DATE,
   LEAD(NEW_DATE,1) OVER (PARTITioN BY ID ORDER BY NEW_DATE ) nextSTARTDATE,
   LAG(NEW_DATE,1) OVER (PARTITION BY ID ORDER BY NEW_DATE ) preENDDATE,
   ROW_NUMBER()OVER(PARTITION BY ID ORDER BY new_DATE DESC) rn
   FROM
  (
  SELECT DISTINCT ID,STARTDATE new_DATE  FROM test_ShenLiang2025    
   WHERE seq in (1,2) -- 可加注释验证,当前仅取原表里2条记录
  UNION
  SELECT DISTINCT ID,ENDDATE new_DATE FROM test_ShenLiang2025
   WHERE seq in (1,2) -- 可加注释验证,当前仅取原表里2条记录
      ORDER BY new_DATE 
  )A
),last AS
( SELECT new_DATE,preENDDATE,id
FROM T0 
WHERE nextSTARTDATE IS NULL
),normal AS
(
 SELECT * FROM
 (
 SELECT id, 
    ENDDATE,
    LEAD(STARTDATE,1) OVER (PARTITION BY ID ORDER BY ENDDATE ) nextSTARTDATE,
    LAG(ENDDATE,1) OVER (PARTITION BY ID ORDER BY ENDDATE ) preENDDATE
    FROM test_ShenLiang2025
 )A
 WHERE ENDDATE > preENDDATE AND ENDDATE < nextSTARTDATE
),T_Serial AS (
 
SELECT ID,ADDDATE(preENDDATE, INTERVAL 1 DAY ) STARTDATE,
new_DATE ENDDATE
FROM last 
 
UNION
 
SELECT bottom_2.ID,bottom_2.new_DATE STARTDATE,
CASE WHEN rn =3 THEN bottom_2.nextSTARTDATE 
 ELSE ADDDATE(bottom_2.nextSTARTDATE, INTERVAL -1 DAY ) END ENDDATE
FROM last 
JOIN T0 bottom_2
ON bottom_2.nextSTARTDATE<=last.preENDDATE AND bottom_2.id = last.id
),T2 AS(
SELECT B.ID,B.STARTDATE,B.ENDDATE FROM
  (
   SELECT A.*,ROW_NUMBER()OVER(PARTITION BY ID,STARTDATE ORDER BY ENDDATE) rn
   FROM
   (
   SELECT A.ID,A.STARTDATE,A.ENDDATE
   FROM T_Serial A
   LEFT JOIN normal B
   ON A.STARTDATE = B.ENDDATE AND A.ID = B.ID
   WHERE B.ENDDATE IS NULL
 
   UNION 
    
   SELECT A.ID,A.STARTDATE,B.ENDDATE   
   FROM T_Serial A
   INNER JOIN normal B
   ON ADDDATE(A.ENDDATE, INTERVAL 1 DAY ) = B.ENDDATE AND A.ID = B.ID    
   )A
  )B WHERE rn =1
)


Step2 时间序列关联原表生成NUM字段。


SELECT T2.STARTDATE,T2.ENDDATE,SUM(T1.NUM) TOTAL FROM T2
JOIN test_ShenLiang2025 T1
ON T2.STARTDATE>=T1.STARTDATE 
 AND T2.ENDDATE<=T1.ENDDATE
GROUP BY T2.STARTDATE,T2.ENDDATE
ORDER BY T2.STARTDATE
 

Step4 查看结果

STARTDATE   ENDDATE     NUM
2021-04-20 2021-04-30 200
2021-05-01 2021-05-03 300
2021-05-04 2021-05-24 100

执行结果:

到此这篇关于时间序列错位还原之SQL实现案例详解的文章就介绍到这了,更多相关SQL时间错位与还原生成案例内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SQL实现时间序列错位还原案列

本文链接: https://www.lsjlt.com/news/135976.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SQL实现时间序列错位还原案列
    目录一、需求描述二、思路概述1 需求延展2 思路概述 三、SQL代码一、需求描述 1 原表T1某条记录(记做r1,相邻下一条为r2)的下一行记录的STARTDATE小于上一行END...
    99+
    2024-04-02
  • Python时间序列的实现
    目录1. datetime模块1.1 datetime对象1.2 字符串和datatime的相互转换2. 时间序列基础3. 重采样及频率转换4. 时间序列可视化5. 窗口函数5.1 ...
    99+
    2023-02-28
    Python 时间序列
  • Python时间序列如何实现
    这篇文章主要介绍“Python时间序列如何实现”,在日常操作中,相信很多人在Python时间序列如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python时间序列如何实现”的疑惑有所帮助!接下来,请跟...
    99+
    2023-07-05
  • pandas时间序列之pd.to_datetime()的实现
    目录解析来自各种来源和格式的时间序列信息时间序列解析之小试牛刀时间序列解析之磨刀霍霍1. 指定识别的format2. 遇到DataFrame3. 遇到不能识别的处理方法4. orig...
    99+
    2024-04-02
  • LSTM实现时间序列预测(PyTorch版)
    💥项目专栏:【深度学习时间序列预测案例】零基础入门经典深度学习时间序列预测项目实战(附代码+数据集+原理介绍) 文章目录 前言 一、基于PyTorch搭建LSTM模型实现风速时间...
    99+
    2023-09-21
    pytorch lstm 深度学习 人工智能 python
  • Python时间序列分析--ARIMA模型实战案例
    Python时间序列分析–ARIMA模型实战案例,利用ARIMA模型对时间序列进行分析的经典案例(详细代码) **本文将介绍使用Python来完成时间序列分析ARIMA模型的完整步骤与流程,绘制时序图...
    99+
    2023-09-10
    python 机器学习 人工智能
  • python时间序列数据相减的实现
    目录1.将读取的时间序列数据转化为timestamp格式2.时间数据的相减在此记录自己学习python数据分析过程中学到的一些数据处理的小技巧。本节主要分享时间数据的相减。 1.将读...
    99+
    2023-05-18
    python时间序列相减 python时间相减
  • Pytorch怎么实现LSTM时间序列预测
    小编给大家分享一下Pytorch怎么实现LSTM时间序列预测,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!开发环境说明:Python 35Pytorch 0.2CPU/GPU均可1、LSTM简介人类在进行学习时,往往不总是...
    99+
    2023-06-15
  • Pytorch 如何实现LSTM时间序列预测
    开发环境说明: Python 35 Pytorch 0.2 CPU/GPU均可 1、LSTM简介 人类在进行学习时,往往不总是零开始,学习物理你会有数学基础、学习英语你会有中文基础等...
    99+
    2024-04-02
  • Pandas.DataFrame时间序列数据处理的实现
    目录如何将一列现有数据指定为DatetimeIndex读取CSV时如何指定DatetimeIndex关于pandas.Series将pandas.DataFrame,pandas.S...
    99+
    2023-02-23
    Pandas.DataFrame时间序列 Pandas时间序列处理
  • Python怎么实现LSTM时间序列预测
    本篇内容主要讲解“Python怎么实现LSTM时间序列预测”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么实现LSTM时间序列预测”吧!参考数据:数据一共两列,左边是日期,右边是乘...
    99+
    2023-06-02
  • Pandas.DataFrame时间序列数据处理如何实现
    本篇内容主要讲解“Pandas.DataFrame时间序列数据处理如何实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Pandas.DataFrame时间序列数据处理如何实现”吧!将panda...
    99+
    2023-07-05
  • Python中怎么实现时间序列可视化
    Python中怎么实现时间序列可视化,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.单个时间序列首先,我们从tushare.pro获取指数日线行情数据,并查看数据类型。imp...
    99+
    2023-06-16
  • Matlab怎么实现时间序列预测分类
    这篇文章主要介绍“Matlab怎么实现时间序列预测分类”,在日常操作中,相信很多人在Matlab怎么实现时间序列预测分类问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Matlab怎么实现时间序列预测分类”的疑...
    99+
    2023-06-20
  • hbase怎么实现数据的时间序列化
    在HBase中,数据的时间序列化通常通过以下方式实现: 使用Timestamp作为数据的时间戳:在HBase中,每条数据都会有一...
    99+
    2024-03-05
    hbase
  • PyTorch+LSTM实现单变量时间序列预测
    目录数据准备模型架构模型训练推理预测总结时间序列是指在一段时间内发生的任何可量化的度量或事件。尽管这听起来微不足道,但几乎任何东西都可以被认为是时间序列。一个月里你每小时的平均心率,...
    99+
    2023-02-22
    PyTorch LSTM单变量时间序列预测 PyTorch LSTM时间序列预测 PyTorch LSTM时间序列
  • sql倒序排列怎么实现
    在 SQL 中,使用 ORDER BY 关键字可以将查询结果按照指定的列进行排序。要倒序排列,可以在 ORDER BY 子句中指定要...
    99+
    2024-04-09
    sql
  • sql降序排列怎么实现
    在SQL中,可以使用ORDER BY子句来实现降序排列。ORDER BY子句可以与SELECT语句一起使用,用于指定按照哪个...
    99+
    2024-04-09
    sql
  • PyTorch搭建ANN实现时间序列风速预测
    目录数据集特征构造数据处理1.数据预处理2.数据集构造ANN模型1.模型训练2.模型预测及表现数据集 数据集为Barcelona某段时间内的气象数据,其中包括温度、湿度以及风速等。...
    99+
    2024-04-02
  • Matlab实现时间序列预测分类实例代码
    目录一、数据准备二、时间序列预测分类1、输入为xt,输出是yt2、有x值,有y值:NARX(1)选择模型类型(2)选择输出,只有y_t(3)选择70%用来作为训练数据,15%用来作为...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作