成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

mysql - sql 左連接結果union右連接結果,導致重復性計算怎么解決?

瀏覽:233日期:2022-06-14 11:29:15

問題描述

滑動計算場景簡化

數據庫環境是MySQL

因為原問題場景比較復雜,下面將其簡化描述:(標題描述可能不太切題)

現在有兩張表t1和t2,表結構相同,但是存儲的數據不同。主鍵a與字段b類型均為int型。示例如下。

其中,表t1和表t2存在部分主鍵a相同,但是字段b值不同的數據。也有主鍵值在表t1中存在,但是表t2中不存在,或者主鍵值在表t2中存在,但是表t1中不存在。

表 t1 :

ab11025374757

表 t2 :

ab317485361176

現在,按主鍵值相同的情況下進行計算,t1.b - t2.b。如果主鍵a的值在對方表中不存在,則字段b取0值。查詢得到如下表結構的數據。

at1.b - t2.b110253-104-1546-117-6

我所想到的sql語句如下:

SELECT t1.a, t1.b - t2.b from t1 left join t2 on t1.a = t2.aunionSELECT t2.a, t1.b - t2.b from t1 right join t2 on t1.a = t2.a;

但是,這條sql不能解決兩個問題:

如果主鍵a的值在對方表中不存在,則字段b取0值。

兩次join會導致主鍵值為3,4,5的數據重復計算

怎么寫sql比較好?

下面的sql可以解決上面的轉0問題,但是仍然解決不了重復計算的問題。

SELECT t1.a, ifnull(t1.b, 0) - ifnull(t2.b, 0) from t1 left join t2 on t1.a = t2.aunionSELECT t2.a, ifnull(t1.b, 0) - ifnull(t2.b, 0) from t1 right join t2 on t1.a = t2.a;

select fa,fb from( SELECT t1.a as fa , ifnull(t1.b, 0) - ifnull(t2.b, 0) as fb from t1 left join t2 on t1.a = t2.a union SELECT t2.a as fa,0-t2.b as fb from t2 where t2.a not in (select t1.a from t1 )) t order by t.fa

以上問題結束。以下是關于原問題場景的模擬及描述,有興趣的可以看下,實現不正確,不夠好的地方望指正。

滑動計算場景模擬

表 t3 :

abc1101252373474575317648753861197610

# 簡單模擬sqlselect t.a , sum(t.b) from ( select t3.a , b from t3 where c <=3 union all select t3.a , 0-b from t3 where c > 7) t group by t.a滑動計算場景描述

表3中沒有代表主鍵的字段,一行代表一次消費記錄,c列可以代表消費時間戳,a列代表用戶號,b列代表消費金額。

現實場景: 目前,想要每隔500毫秒就要計算一次當前時間之前24小時內的每位用戶交易的總金額,總次數。(甚至平均值、方差、標準差等,注意:方差、標準差這些統計方式不適用于滑動計算,在此不考慮)

模擬場景: 現在假設每隔時間t只有一條交易,表3中c列的值代表每次遞增t,每隔t的時間計算一次當前時間之前4t到當前時間的總金額。如果每次都是完整的計算4t時間內的總金額,總次數,可能消耗比較大。

之后,每次計算都需要將計算結果持久化到表4當中(表4中用戶號唯一,如果存在該用戶,則更新總金額,總次數,否則,直接插入)。

比如,第一次計算的當前時間為6,需要計算c <= 6 and c > 6-4的sql示例為:

select t3.a , sum(t3.b) , count(1) from t3 where 1=1 and (c <= 6 and c > 6-4) group by t3.a;# 注意 表4 中 需要添加關于字段a的唯一約束insert into t4 (a,sumb,cnt) values (3, 24, 2) on duplicate key update sumb = 24 , cnt = 2;insert into t4 (a,sumb,cnt) values (4, 7, 1) on duplicate key update sumb = 7 , cnt = 1;insert into t4 (a,sumb,cnt) values (5, 7, 1) on duplicate key update sumb = 7 , cnt = 1;

第二次計算的當前時間為7,需要計算c <= 7 and c > 7-4之間消費記錄的總金額,總次數,在現實中,4t所代表的時間跨度(24 hour)總是很大,如果按照上述sql去計算,則每次計算都要觸及大量的交易記錄,雖然計算的負擔在數據庫而不在于業務邏輯。而t所代表的計算時間相對較小(500 ms),每隔t時間,新增的消費記錄總是比較少。

select t3.a , sum(t3.b) , count(1) from t3 where 1=1 and (c <= 7 and c > 7-4) group by t3.a;# 查詢結果 : (3,17,1),(4,15,2) ,(5,7,1 )# 持久化查詢結果。注意:表4 中 需要添加關于字段a的唯一約束insert into t4 (a,sumb,cnt) values (3,17,1) on duplicate key update sumb = 17 , cnt = 1;insert into t4 (a,sumb,cnt) values (4,15,2) on duplicate key update sumb = 15 , cnt = 2;insert into t4 (a,sumb,cnt) values (5,7,1 ) on duplicate key update sumb = 7 , cnt = 1;

現在,第一次計算采用上邊的所述的全量計算方案,而第二次計算如果能借助第一次計算的結果,加上第二次相對于第一次新增的消費記錄(即c=7的記錄),再減去第二次相對于第一次所減少的消費記錄(即c=3的記錄)。(在此,不再介紹如何找出新增或減少的記錄)

select t3.a , sum(t3.b) , count(1) from t3 where 1=1 and (c <= 6 and c > 6-4) group by t3.a;# 查詢結果 : (3, 24, 2),(4, 7, 1) ,(5, 7, 1)# 持久化查詢結果。注意:表4 中 需要添加關于字段a的唯一約束insert into t4 (a,sumb,cnt) values (3,24,2) on duplicate key update sumb = 24, cnt = 2;insert into t4 (a,sumb,cnt) values (4,7,1) on duplicate key update sumb = 7, cnt = 1;insert into t4 (a,sumb,cnt) values (5,7,1) on duplicate key update sumb = 7, cnt = 1;

select t.a , t.sumb, t.cnt from ( select t3.a as a , sum(t3.b) as sumb, count(1) as cnt from t3 where 1=1 and c=7 group by t3.a union all select t3.a as a,0-sum(t3.b) as sumb,0-count(1) as cnt from t3 where 1=1 and c=3 group by t3.a) t# 查詢結果 : (4,8,1), (3,-7,-1)# 持久化查詢結果。注意:4 中 需要添加關于字段a的唯一約束insert into t4 (a,sumb,cnt) values (4,8,1) on duplicate key update sumb = sumb+8,cnt = cnt+1;insert into t4 (a,sumb,cnt) values (3,-7,-1) on duplicate key update sumb = sumb-7,cnt = cnt-1;

問題解答

回答1:

select t.a , sum(t.b) from (select t1.a , b from t1 union allselect t2.a , 0-b from t2 ) t group by t.a

說下這個答案僅僅是對于模擬場景簡化的回答。問題下邊的滑動計算場景模擬與滑動計算場景描述中有更為詳盡的描述過程,有興趣的可以看下。

回答2:

(select t1.a as a, ifnull(t1.b, 0) - ifnull(t2.b, 0) as bfrom t1 left join t2 on t1.a = t2.awhere t1.a in (select a from t1 union select a from t2))union(select t2.a as a, ifnull(t1.b, 0) - ifnull(t2.b, 0) as bfrom t1 right join t2 on t1.a = t2.awhere t2.a not in (select a from t1));

union之前是根據a的主鍵,計算;union之后是根據b(且不在a出現)的主鍵,計算;

回答3:

首先請檢查一下你給的示例結果,主鍵a為3,4,5的計算結果應該是正負相反了。

使用FULL JOIN語句和NVL函數結合,一次表連接就可以計算出來了。

SELECT NVL(t1.a, t2.a), NVL(t1.b, 0) - NVL(t2.b, 0)FROM t1 FULL JOIN t2 ON t1.a = t2.a回答4:

select ifnull(t1a,t2a) a, ifnull(t1b,0)-ifnull(t2b,0) b from (SELECT t1.a t1a,t1.b t1b,t2.a t2a,t2.b t2b FROM t1 left join t2 on t1.a = t2.aunion SELECT t1.a t1a,t1.b t1b,t2.a t2a,t2.b t2b FROM t1 right join t2 on t1.a = t2.a) eee order by a

回答5:

先union羅列下 結果的a有多少,再做減法就好,nvl判斷是否為空,空則置0:select AA.A,nvl(BB.b,0)-nvl(cc.b,0)from (select afrom t1union select afrom t2) AA,t1 BB,t2 CCwhere AA.A=BB.A(+) and CC.A(+)=AA.a

成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产精品自在在线| 91精品国产综合久久精品app| 欧美精品一区二区在线播放| 国产成人99久久亚洲综合精品| 国产片一区二区| 色婷婷综合久久| 欧美~级网站不卡| 婷婷六月综合亚洲| 国产午夜精品久久| 欧美这里有精品| 国产一区日韩一区| 狠狠色狠狠色综合系列| 国产精品嫩草99a| 国产精品一区视频| 风流少妇一区二区| 亚洲成人精品在线观看| 国产片一区二区三区| 欧美日韩午夜精品| 欧美特黄视频| 国产午夜精品一区二区三区嫩草| 国产精品亚洲综合| 国产91色综合久久免费分享| 亚洲欧洲在线观看av| 欧洲精品一区二区| 国产精品播放| 国产成人精品影视| 一区二区三区中文字幕| 国产女人aaa级久久久级 | 久久这里只有精品首页| 久久精品人人| 亚洲三级网站| 精品不卡一区二区三区| 99国产精品久久久久| 成人一区二区视频| 国产成人av一区二区三区在线观看| 一区二区日韩av| 久久久精品综合| 欧美一级日韩免费不卡| 91福利在线播放| 亚洲欧美日韩精品久久久| 香蕉成人久久| 日本韩国欧美一区二区三区| 久久综合导航| 在线观看91av| 精品国产免费一区二区三区香蕉| 欧美人与禽zozo性伦| 欧美在线观看视频在线| 国产女主播一区二区| 国产一区二区三区四区三区四| 99re这里只有精品首页| 成人精品高清在线| av网站一区二区三区| 国产美女久久久久| 日日欢夜夜爽一区| 亚洲欧美在线另类| 中文字幕av免费专区久久| 欧美一区二区女人| 欧美日韩在线播放三区| 美女视频一区免费观看| 国产精品多人| 日韩电影在线免费观看| 亚洲福利视频一区二区| 国产午夜精品美女毛片视频| 老司机亚洲精品| 久久亚洲图片| 久久欧美肥婆一二区| 色偷偷88欧美精品久久久| 亚洲一区网站| 久久午夜av| 在线观看亚洲一区| 91精品国产综合久久婷婷香蕉| 欧美在线|欧美| 制服丝袜激情欧洲亚洲| 精品久久人人做人人爱| 欧美激情自拍偷拍| 国产欧美久久久精品影院| 国产精品天天看| 亚洲一区在线免费观看| 日韩av网站在线观看| 精品影院一区二区久久久| 国产99精品在线观看| 亚洲国产精品麻豆| 精品一区中文字幕| 99视频热这里只有精品免费| 黄色另类av| 久久大逼视频| 日韩欧美一区二区免费| 精品国产精品网麻豆系列| 樱桃国产成人精品视频| 成人深夜福利app| 欧美日韩少妇| 在线视频欧美区| 日韩一级片网站| 亚洲日本va午夜在线电影| 国产精品视频线看| 极品少妇xxxx精品少妇偷拍 | 亚洲一区尤物| 67194成人在线观看| 欧美二区三区91| 中文字幕欧美激情一区| 欧美日韩亚洲综合在线| 亚洲素人一区二区| 国产又粗又猛又爽又黄91精品| 欧美一区二区在线| 色欧美片视频在线观看在线视频| 久久精品欧美一区二区三区不卡| 精品一区二区影视| 日本91福利区| 激情亚洲网站| 国产欧美精品国产国产专区| 国产二区国产一区在线观看| 国产高清精品久久久久| 国内自拍一区| 99视频有精品| 亚洲精品一线二线三线| 亚洲欧美日韩国产一区二区三区 | 久久国产人妖系列| 精品国产91久久久久久久妲己| 国产日韩欧美一区二区三区在线观看| 日本va欧美va瓶| 久久九九电影| 国产精一品亚洲二区在线视频| 欧美不卡123| 久久久精品动漫| 先锋影音久久| 精品亚洲成a人在线观看| 国产精品色噜噜| 欧美日韩视频一区二区| 模特精品在线| 欧美xxxxxxxx| 日韩免费观看2025年上映的电影| 亚洲欧美一区二区三区孕妇| 精品日韩在线观看| 亚洲午夜电影| 今天的高清视频免费播放成人| 久久嫩草精品久久久久| 久久婷婷国产综合国色天香| 成人黄色一级视频| 日韩激情一区二区| 久久久噜噜噜久噜久久综合| 日韩亚洲欧美高清| 国产精品传媒视频| 自拍偷拍亚洲综合| 久久精品中文| 一本一道波多野结衣一区二区 | 久久久不卡影院| 男女男精品网站| 在线观看av一区| 欧美激情偷拍| 日韩电影在线看| 欧美激情在线看| 欧美放荡的少妇| 国产伦精品一区二区三| 99久久精品费精品国产一区二区| 日韩av一二三| 亚洲欧美日韩电影| 精品国产乱码久久久久久夜甘婷婷 | 制服诱惑一区二区| 丰满白嫩尤物一区二区| 亚洲bdsm女犯bdsm网站| 国产欧美日韩亚州综合| 欧美视频一二三区| 一区二区不卡在线视频 午夜欧美不卡'| 国产成人自拍在线| 水野朝阳av一区二区三区| 一区二区三区欧美久久| 中文字幕亚洲电影| 国产精品毛片久久久久久久| 日本一区二区三区免费乱视频| 精品久久国产字幕高潮| 欧美精品色综合| 欧美日韩性生活| 欧美日韩国产一级片| 91极品美女在线| 欧美在线观看视频在线| 国产欧美日韩一区二区三区| 欧美阿v一级看视频| 国产精品一二一区| 视频一区欧美日韩| 亚洲欧美日韩一区二区三区在线观看| 久久综合久久鬼色中文字| 欧美日韩综合在线免费观看| 国产日韩三区| 激情另类综合| jizz一区二区| 久久爱www久久做| 午夜国产精品影院在线观看| 亚洲色欲色欲www| 国产精品日韩成人| 久久夜色精品一区| 日韩色在线观看| 91精品国产综合久久精品app | 免费在线视频一区| 蜜臀a∨国产成人精品| 久久 天天综合| 国产二区国产一区在线观看| 成人在线综合网| 91丨porny丨最新| 激情久久中文字幕| 香蕉视频成人在线观看|