MySQL對(duì)排序之后的數(shù)據(jù)根據(jù)某個(gè)列字段計(jì)算其前后兩個(gè)值的變化率

image

ZERO

????持續(xù)更新 請(qǐng)關(guān)注:https://zorkelvll.cn/blogs/zorkelvll/articles/2018/11/02/1541172528332

背景

??本文主要是針對(duì)在實(shí)際應(yīng)用場景中出現(xiàn)的“排序之后的數(shù)據(jù)根據(jù)某個(gè)列字段計(jì)算其前后兩個(gè)值的變化率,構(gòu)造出變化率這一列”的這樣一種需求,提供一種解決方案實(shí)踐,并結(jié)合具體的實(shí)例給出sql代碼瘤睹!

描述

??SQL對(duì)排序之后的數(shù)據(jù)根據(jù)某個(gè)字段前后兩個(gè)計(jì)算變化率

??SQL對(duì)于根據(jù)某個(gè)表中的【根據(jù)字段S_INFO_WINDCODE分組啤咽,且組內(nèi)根據(jù)字段TRADE_DT升序之后的各組數(shù)據(jù),對(duì)于各個(gè)組內(nèi)計(jì)算S_MARGIN_PURCHWITHBORROWMONEY的前后變化率】

??也即墓卦,對(duì)于表AShareMarginTrade(字段:TRADE_DT、S_INFO_WINDCODE、S_MARGIN_PURCHWITHBORROWMONEY)中的字段S_MARGIN_PURCHWITHBORROWMONEY數(shù)據(jù)馅闽,需要根據(jù)對(duì)于相同的S_INFO_WINDCODE下按照TRADE_DT升序排列分別計(jì)算各個(gè)S_INFO_WINDCODE的S_MARGIN_PURCHWITHBORROWMONEY前后兩條之間的變化率

場景

  • 原始表
S_INFO_WINDCODE TRADE_DT S_MARGIN_PURCHWITHBORROWMONEY
000001.SZ 20160815 320007905.0000
000001.SZ 20160812 277171367.0000
000001.SZ 20160816 209357556.0000
000002.SZ 20160812 1003339884.0000
000002.SZ 20160815 769999464.0000
  • 構(gòu)造邏輯:

??對(duì)于S_INFO_WINDCODE分組,組內(nèi)根據(jù)TRADE_DT順序排序馍迄,組內(nèi)分別計(jì)算后一個(gè)叫

  • 目標(biāo)表:
S_INFO_WINDCODE TRADE_DT S_MARGIN_PURCHWITHBORROWMONEY S_MARGIN_PURCHWITHBORROWMONEY_VAR
000001.SZ 20160815 320007905.0000 0.15454893
000001.SZ 20160812 277171367.0000 NULL
000001.SZ 20160816 209357556.0000 -0.34577380
000002.SZ 20160812 1003339884.0000 NULL
000002.SZ 20160815 769999464.0000 -0.23256368
  • 解決思路:

(1)通過創(chuàng)建兩張表(也可以選擇為創(chuàng)建TEMPORARY臨時(shí)表)temp和temp2福也,同時(shí)在對(duì)兩張表初始化數(shù)據(jù)的時(shí)候分別是設(shè)置序號(hào)rank(起始值0和1,且數(shù)據(jù)保證是按照字段S_INFO_WINDCODE值相同和字段TRADE_DT升序排列攀圈,這樣的一個(gè)順序rank順序增加的)

(2)將兩張表temp和temp2進(jìn)行join操作暴凑,且條件是rank相等(其實(shí)是原表中剛好錯(cuò)位了的前后兩條被放在同一條記錄中了)和相同的t2(也即原有的S_INFO_WINDCODE字段值),則可以計(jì)算出來某個(gè)S_INFO_WINDCODE某兩條相鄰的(TRADE_DT)記錄間的變化率

(3)將(2)中的計(jì)算結(jié)果以一個(gè)新的字段形式存儲(chǔ)在原表AShareMarginTrade中

具體實(shí)現(xiàn)的詳細(xì)SQL語句:

-- 如果存在則刪除臨時(shí)表temp 
DROP TABLE IF EXISTS `temp`;
-- 創(chuàng)建臨時(shí)表temp赘来,且對(duì)其排序之后增加序號(hào)
SELECT @rownum := 0;
CREATE TABLE IF NOT EXISTS
temp(t1 VARCHAR(8),t2 VARCHAR(20),t3 DECIMAL(20,4),rank INT,INDEX(rank))
SELECT mt.TRADE_DT t1,mt.S_INFO_WINDCODE t2,mt.S_MARGIN_PURCHWITHBORROWMONEY t3, @rownum := @rownum + 1 AS rank
FROM AShareMarginTrade mt
ORDER BY mt.S_INFO_WINDCODE,mt.TRADE_DT;

-- 如果存在則刪除臨時(shí)表temp2 
DROP TABLE IF EXISTS `temp2`;
-- 創(chuàng)建臨時(shí)表temp2现喳,且對(duì)其排序之后增加序號(hào)(相比較temp中的需要,全部都加了1)
SELECT @rownum := 1;
CREATE TABLE IF NOT EXISTS
temp2(t1 VARCHAR(8),t2 VARCHAR(20),t3 DECIMAL(20,4),rank INT,INDEX(rank))
SELECT mt.TRADE_DT t1,mt.S_INFO_WINDCODE t2,mt.S_MARGIN_PURCHWITHBORROWMONEY t3, @rownum := @rownum + 1 AS rank
FROM AShareMarginTrade mt
ORDER BY mt.S_INFO_WINDCODE,mt.TRADE_DT;

-- 計(jì)算變化率:將表temp與temp2根據(jù)rank及code相同的犬辰,聯(lián)表聯(lián)出來也即將原表中同一個(gè)code中date相鄰的兩個(gè)聯(lián)成同一行記錄中了嗦篱,并且計(jì)算變化率
SELECT a.rank,a.t1 next,b.t1 pre,a.t2 `code`,(a.t3 - b.t3) / b.t3 as var
FROM temp a
LEFT JOIN temp2 b ON b.rank=a.rank AND b.t2=a.t2 AND b.t3 != 0
-- HAVING a.rank != 1 AND var IS NOT NULL AND a.t1 = '20161014'
HAVING a.rank != 1 AND var IS NOT NULL
ORDER BY var DESC ;

-- 創(chuàng)建列名S_MARGIN_PURCHWITHBORROWMONEY_VAR  
SET @dbname = DATABASE();  
SET @tablename = "AShareMarginTrade";  
SET @columnname = "S_MARGIN_PURCHWITHBORROWMONEY_VAR";  
SET @preparedStatement = (SELECT IF(  
  (  
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS  
    WHERE  
      (table_name = @tablename)  
      AND (table_schema = @dbname)  
      AND (column_name = @columnname)  
  ) > 0,  
  "SELECT 1",  
  CONCAT("ALTER TABLE ", @tablename, " ADD ", @columnname, " DECIMAL(20,8) DEFAULT NULL AFTER `S_MARGIN_PURCHWITHBORROWMONEY`;")  
)); 
-- ALTER TABLE `AShareMarginTrade` ADD `S_MARGIN_PURCHWITHBORROWMONEY_VAR` DECIMAL(20,8) DEFAULT NULL AFTER `S_MARGIN_PURCHWITHBORROWMONEY`;

UPDATE AShareMarginTrade aa,
(
-- start 計(jì)算變化率 
SELECT a.rank,a.t1 next,b.t1 pre,a.t2 `code`,(a.t3 - b.t3) / b.t3 as var
FROM temp a
LEFT JOIN temp2 b ON b.rank=a.rank AND b.t2=a.t2 AND b.t3 != 0
HAVING a.rank != 1 AND var IS NOT NULL
-- end 計(jì)算變化率 
) AS tt
SET aa.S_MARGIN_PURCHWITHBORROWMONEY_VAR = tt.var
WHERE tt.next = aa.TRADE_DT AND tt.`code`=aa.S_INFO_WINDCODE;

-- 刪除臨時(shí)表 
DROP TABLE IF EXISTS `temp`;
DROP TABLE IF EXISTS `temp2`;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市忧风,隨后出現(xiàn)的幾起案子默色,更是在濱河造成了極大的恐慌,老刑警劉巖狮腿,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腿宰,死亡現(xiàn)場離奇詭異,居然都是意外死亡缘厢,警方通過查閱死者的電腦和手機(jī)吃度,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贴硫,“玉大人椿每,你說我怎么就攤上這事伊者。” “怎么了间护?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵亦渗,是天一觀的道長。 經(jīng)常有香客問我汁尺,道長法精,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任痴突,我火速辦了婚禮搂蜓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辽装。我一直安慰自己帮碰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布拾积。 她就那樣靜靜地躺著殉挽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拓巧。 梳的紋絲不亂的頭發(fā)上此再,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音玲销,去河邊找鬼。 笑死摘符,一個(gè)胖子當(dāng)著我的面吹牛贤斜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逛裤,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼瘩绒,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了带族?” 一聲冷哼從身側(cè)響起锁荔,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蝙砌,沒想到半個(gè)月后阳堕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡择克,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年恬总,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肚邢。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡壹堰,死狀恐怖拭卿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贱纠,我是刑警寧澤峻厚,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站谆焊,受9級(jí)特大地震影響惠桃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜懊渡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一刽射、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧剃执,春花似錦誓禁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至怒见,卻和暖如春俗慈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背遣耍。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來泰國打工闺阱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人舵变。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓酣溃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親纪隙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赊豌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容