最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQL實(shí)現(xiàn)時(shí)間序列錯(cuò)位還原案列

 更新時(shí)間:2021年09月16日 17:19:25   作者:ShenLiang2025  
這篇文章小編主要向大家介紹的是時(shí)間序列錯(cuò)位還原之SQL實(shí)現(xiàn)案例詳解的相關(guān)資料,需要的小伙伴可以參考下面文章的具體內(nèi)容

一、需求描述

1 原表T1某條記錄(記做r1,相鄰下一條為r2)的下一行記錄的STARTDATE小于上一行ENDDATE,針對(duì)這樣的記錄做轉(zhuǎn)換即:

r1STARTDATE保持不變,ENDDATE為r1STARTDATE-1

r2STARTDATE為r1的ENDDATE,ENDDATE為r1ENDDATE

2 如果原表T1不存在相鄰行“時(shí)間重疊”(即為1的定義)時(shí)保持原有數(shù)據(jù)不變。

 # 文本版
#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
 
 
#輸出結(jié)果
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條記錄同時(shí)疊加在第2和3條記錄里。

2 思路概述

1) T0 通過(guò)上下行函數(shù)生成的時(shí)間序列

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里的最后一條記錄,為后面的矯正做準(zhǔn)備。

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


3) normal 取出原始數(shù)據(jù)里不會(huì)出現(xiàn)時(shí)間疊加的記錄,為后面的矯正做準(zhǔn)備。
當(dāng)前演示數(shù)據(jù)無(wú)記錄,代碼加注釋可浮現(xiàn)。

4)T_Serial 統(tǒng)一定義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 對(duì)時(shí)間沒(méi)有重疊的記錄進(jìn)行修正(刪除T0對(duì)應(yīng)值,更新對(duì)應(yīng)ENDDATE)。
當(dāng)前示例結(jié)果集為空,即無(wú)需要修正。

6) T2關(guān)聯(lián)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代碼

當(dāng)前演示版本是Mysql 8.0.23,支持CTE、窗口函數(shù)的SQL Server、Oracle需要修改Order byADDDATE處語(yǔ)法。
Step0 創(chuàng)建表并初始化數(shù)據(jù)

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 構(gòu)建臨時(shí)結(jié)果集以生成時(shí)間序列。

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) -- 可加注釋驗(yàn)證,當(dāng)前僅取原表里2條記錄
  UNION
  SELECT DISTINCT ID,ENDDATE new_DATE FROM test_ShenLiang2025
   WHERE seq in (1,2) -- 可加注釋驗(yàn)證,當(dāng)前僅取原表里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 時(shí)間序列關(guān)聯(lián)原表生成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 查看結(jié)果

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

執(zhí)行結(jié)果:

到此這篇關(guān)于時(shí)間序列錯(cuò)位還原之SQL實(shí)現(xiàn)案例詳解的文章就介紹到這了,更多相關(guān)SQL時(shí)間錯(cuò)位與還原生成案例內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql非主鍵自增長(zhǎng)用法實(shí)例分析

    mysql非主鍵自增長(zhǎng)用法實(shí)例分析

    這篇文章主要介紹了mysql非主鍵自增長(zhǎng)用法,結(jié)合實(shí)例形式分析了MySQL非主鍵自增長(zhǎng)的基本設(shè)置、使用方法與操作注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • MySQL數(shù)據(jù)表索引命名規(guī)范的實(shí)現(xiàn)示例

    MySQL數(shù)據(jù)表索引命名規(guī)范的實(shí)現(xiàn)示例

    索引是提高查詢性能的重要工具,本文主要介紹了MySQL數(shù)據(jù)表索引命名規(guī)范的實(shí)現(xiàn)示例,包括不同類型索引的命名方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • 以mysql為例詳解ToplingDB?的?UintIndex

    以mysql為例詳解ToplingDB?的?UintIndex

    本文主要介紹了以mysql為例詳解ToplingDB的UintIndex,在ToplingDB的CO-Index(Compressed?Ordered?Index)家族中,Nest?Succinct?Trie是最通用的,更多相關(guān)內(nèi)容需要的朋友可以參考一下
    2022-08-08
  • MySQL之鎖類型解讀

    MySQL之鎖類型解讀

    MySQL鎖類型包括讀鎖(共享鎖)和寫(xiě)鎖(排他鎖),并介紹了意向鎖、自增鎖、元數(shù)據(jù)鎖、行級(jí)鎖和間隙鎖等概念,悲觀鎖和樂(lè)觀鎖是兩種不同的鎖設(shè)計(jì)思想,悲觀鎖在每次操作前加鎖,適用于并發(fā)沖突多的場(chǎng)景;樂(lè)觀鎖在更新時(shí)判斷數(shù)據(jù)是否被修改
    2025-02-02
  • win10 mysql 5.6.35 winx64免安裝版配置教程

    win10 mysql 5.6.35 winx64免安裝版配置教程

    這篇文章主要為大家詳細(xì)介紹了win10 mysql 5.6.35 winx64免安裝版配置教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • mysql數(shù)據(jù)庫(kù)應(yīng)付大流量網(wǎng)站的的3種架構(gòu)擴(kuò)展方式介紹

    mysql數(shù)據(jù)庫(kù)應(yīng)付大流量網(wǎng)站的的3種架構(gòu)擴(kuò)展方式介紹

    這篇文章主要介紹了mysql數(shù)據(jù)庫(kù)應(yīng)付大流量網(wǎng)站的的3種架構(gòu)擴(kuò)展方式介紹,它們分別是讀寫(xiě)分離、垂直分區(qū)、水平分區(qū),本文分別對(duì)它們做了講解,需要的朋友可以參考下
    2014-07-07
  • MySQL日期與時(shí)間函數(shù)的使用匯總

    MySQL日期與時(shí)間函數(shù)的使用匯總

    這篇文章主要給大家匯總介紹了關(guān)于MySQL日期與時(shí)間函數(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 分享101個(gè)MySQL調(diào)試與優(yōu)化技巧

    分享101個(gè)MySQL調(diào)試與優(yōu)化技巧

    隨著越來(lái)越多的數(shù)據(jù)庫(kù)驅(qū)動(dòng)的應(yīng)用程序,人們一直在推動(dòng)MySQL發(fā)展到它的極限。這里是101條調(diào)節(jié)和優(yōu)化MySQL安裝的技巧。一些技巧是針對(duì)特定的安裝環(huán)境的,但這些思路是通用的。我已經(jīng)把他們分成幾類,來(lái)幫助你掌握更多MySQL的調(diào)節(jié)和優(yōu)化技巧
    2017-05-05
  • 解決MySQL讀寫(xiě)分離導(dǎo)致insert后select不到數(shù)據(jù)的問(wèn)題

    解決MySQL讀寫(xiě)分離導(dǎo)致insert后select不到數(shù)據(jù)的問(wèn)題

    這篇文章主要介紹了解決MySQL讀寫(xiě)分離導(dǎo)致insert后select不到數(shù)據(jù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • MySQL中datetime和timestamp的區(qū)別及使用詳解

    MySQL中datetime和timestamp的區(qū)別及使用詳解

    這篇文章主要介紹了MySQL中datetime和timestamp的區(qū)別及使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11

最新評(píng)論

上思县| 闻喜县| 柞水县| 兖州市| 锡林浩特市| 高邑县| 聊城市| 绥江县| 武安市| 垣曲县| 五台县| 昌邑市| 耒阳市| 香格里拉县| 翁源县| 兴义市| 通城县| 泰和县| 孝感市| 株洲县| 招远市| 定襄县| 沙河市| 鹤庆县| 松阳县| 唐山市| 边坝县| 静安区| 白河县| 扬中市| 余庆县| 太仓市| 驻马店市| 霍林郭勒市| 安溪县| 绍兴县| 天柱县| 四子王旗| 合江县| 曲水县| 民丰县|