校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 僅用一句SQL更新整張表的漲跌幅、漲跌率的解決方案

僅用一句SQL更新整張表的漲跌幅、漲跌率的解決方案

熱門標簽:武漢AI電銷機器人 地圖標注如何弄全套標 萬利達綜合醫院地圖標注點 實體店地圖標注怎么標 外呼系統會封嗎 在電子版地圖標注要收費嗎 南京電銷外呼系統哪家好 股票配資電銷機器人 電銷機器人 深圳

問題場景

各大平臺店鋪的三項評分(物流、服務、商品)變化情況;
商品每日價格的變化記錄;
股票的實時漲跌浮;

復現場景

表:主鍵ID,商品編號,記錄時的時間,記錄時的價格,創建時間。
問題:獲取每個商品每次的變化情況(漲跌幅、漲跌率)。

解決思路

1、要想高效率的更新漲跌,就肯定不能是逐條數據更新,要通過自連表建立起對應關系,將每一條數據關聯到上一次的價格數據。

2、由于數據庫非常龐大,所以可能存在很多垃圾數據,就比如說相關的字段值為NULL或者非有效值的,這些數據要先排除掉。

SELECT id,goods_code,goods_date,goods_price FROM test_goods_price_change WHERE goods_price IS NOT NULL AND goods_date IS NOT NULL;

3、然后在獲取每條數據的上一條數據,同樣也要先排除掉垃圾數據。

SELECT tmp_a.*, MAX(tmp_b.goods_date) AS last_date FROM 
( SELECT id,goods_code,goods_date,goods_price FROM test_goods_price_change WHERE goods_price IS NOT NULL AND goods_date IS NOT NULL ) AS tmp_a
LEFT JOIN
( SELECT id,goods_code,goods_date,goods_price FROM test_goods_price_change WHERE goods_price IS NOT NULL AND goods_date IS NOT NULL ) AS tmp_b
ON tmp_a.goods_code = tmp_b.goods_code AND tmp_a.goods_date > tmp_b.goods_date GROUP BY tmp_a.id;

4、獲取到上一條數據后,獲取上條數據對應的商品價格。

SELECT tmp_ab.*,tmp_c.goods_price AS last_price FROM 
(
	SELECT tmp_a.*, MAX(tmp_b.goods_date) AS last_date FROM 
	( SELECT id,goods_code,goods_date,goods_price FROM test_goods_price_change WHERE goods_price IS NOT NULL AND goods_date IS NOT NULL ) AS tmp_a
	LEFT JOIN
	( SELECT id,goods_code,goods_date,goods_price FROM test_goods_price_change WHERE goods_price IS NOT NULL AND goods_date IS NOT NULL ) AS tmp_b
	ON tmp_a.goods_code = tmp_b.goods_code AND tmp_a.goods_date > tmp_b.goods_date GROUP BY tmp_a.id
) AS tmp_ab 
LEFT JOIN (SELECT id,goods_code,goods_date,goods_price FROM test_goods_price_change WHERE goods_price IS NOT NULL AND goods_date IS NOT NULL ) AS tmp_c
ON tmp_ab.goods_code = tmp_c.goods_code AND tmp_c.goods_date = tmp_ab.last_date ORDER BY tmp_ab.id;

5、獲取到上條數據以及對應的價格后,開始進行計算,獲取到最終的結果。

SELECT 
	*, 
	(CONVERT(goods_price, DECIMAL(10,2)) - CONVERT(last_price, DECIMAL(10,2))) AS '漲跌幅',
	ROUND((CONVERT(goods_price, DECIMAL(10,2)) - CONVERT(last_price, DECIMAL(10,2)))/CONVERT(last_price, DECIMAL(10,2)), 2) AS '漲跌率' 
FROM (
	SELECT tmp_ab.*,tmp_c.goods_price AS last_price FROM 
	(
		SELECT tmp_a.*, MAX(tmp_b.goods_date) AS last_date FROM 
		( SELECT id,goods_code,goods_date,goods_price FROM test_goods_price_change WHERE goods_price IS NOT NULL AND goods_date IS NOT NULL ) AS tmp_a
		LEFT JOIN
		( SELECT id,goods_code,goods_date,goods_price FROM test_goods_price_change WHERE goods_price IS NOT NULL AND goods_date IS NOT NULL ) AS tmp_b
		ON tmp_a.goods_code = tmp_b.goods_code AND tmp_a.goods_date > tmp_b.goods_date GROUP BY tmp_a.id
	) AS tmp_ab 
	LEFT JOIN (SELECT id,goods_code,goods_date,goods_price FROM test_goods_price_change WHERE goods_price IS NOT NULL AND goods_date IS NOT NULL ) AS tmp_c
	ON tmp_ab.goods_code = tmp_c.goods_code AND tmp_c.goods_date = tmp_ab.last_date ORDER BY tmp_ab.id
) AS tmp

解決方案

-- 創建表SQL
CREATE TABLE `test_goods_price_change` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
  `goods_code` varchar(50) NOT NULL COMMENT '商品編碼',
  `goods_date` int(11) NOT NULL COMMENT '記錄時的時間',
  `goods_price` decimal(10,2) NOT NULL COMMENT '記錄時的價格',
  `created_at` int(11) NOT NULL COMMENT '創建時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB CHARSET=utf8mb4;

-- 獲取漲跌浮SQL
SELECT 
	*, 
	(CONVERT(goods_price, DECIMAL(10,2)) - CONVERT(last_price, DECIMAL(10,2))) AS '漲跌幅',
	ROUND((CONVERT(goods_price, DECIMAL(10,2)) - CONVERT(last_price, DECIMAL(10,2)))/CONVERT(last_price, DECIMAL(10,2)), 2) AS '漲跌率' 
FROM (
	SELECT tmp_ab.*,tmp_c.goods_price AS last_price FROM 
	(
		SELECT tmp_a.*, MAX(tmp_b.goods_date) AS last_date FROM 
		( SELECT id,goods_code,goods_date,goods_price FROM test_goods_price_change WHERE goods_price IS NOT NULL AND goods_date IS NOT NULL ) AS tmp_a
		LEFT JOIN
		( SELECT id,goods_code,goods_date,goods_price FROM test_goods_price_change WHERE goods_price IS NOT NULL AND goods_date IS NOT NULL ) AS tmp_b
		ON tmp_a.goods_code = tmp_b.goods_code AND tmp_a.goods_date > tmp_b.goods_date GROUP BY tmp_a.id
	) AS tmp_ab 
	LEFT JOIN (SELECT id,goods_code,goods_date,goods_price FROM test_goods_price_change WHERE goods_price IS NOT NULL AND goods_date IS NOT NULL ) AS tmp_c
	ON tmp_ab.goods_code = tmp_c.goods_code AND tmp_c.goods_date = tmp_ab.last_date ORDER BY tmp_ab.id
) AS tmp

到此這篇關于僅用一句SQL更新整張表的漲跌幅、漲跌率的文章就介紹到這了,更多相關SQL更新整張表內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Mysql update多表聯合更新的方法小結
  • mysql實現查詢數據并根據條件更新到另一張表的方法示例
  • 如何使用MySQL一個表中的字段更新另一個表中字段
  • Mysql 根據一個表數據更新另一個表的某些字段(sql語句)
  • MySQL數據庫同時查詢更新同一張表的方法
  • mysql用一個表更新另一個表的方法

標簽:武威 泰安 安徽 濟源 濟寧 臺州 汕頭 廣東

巨人網絡通訊聲明:本文標題《僅用一句SQL更新整張表的漲跌幅、漲跌率的解決方案》,本文關鍵詞  僅用,一句,SQL,更新,整張,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《僅用一句SQL更新整張表的漲跌幅、漲跌率的解決方案》相關的同類信息!
  • 本頁收集關于僅用一句SQL更新整張表的漲跌幅、漲跌率的解決方案的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 吴旗县| 普兰店市| 汝城县| 吉林省| 江都市| 宁陵县| 抚顺市| 涿州市| 广宁县| 保山市| 建德市| 溧水县| 江永县| 嵩明县| 佳木斯市| 工布江达县| 安义县| 三台县| 芦溪县| 石门县| 城固县| 祥云县| 呈贡县| 威信县| 上思县| 丹东市| 抚顺市| 宁陕县| 盘锦市| 航空| 雷州市| 白城市| 孟连| 中方县| 故城县| 梓潼县| 阳山县| 金沙县| 兴义市| 若尔盖县| 东乡族自治县|