2016-09-30 54 views
0

我有一個有趣的情況。我將發佈SQL然後解釋。MySQL內部較大記錄集總和

SELECT 
    `c`.`clusterName` AS `clusterName`, 
    DATE_FORMAT(`p`.`insertedTS`, '%Y-%m-%d') AS `insertedDate`, 
    MAX(`p`.`maxMemory`) AS `peakMaxMemory`, 
    MIN(`p`.`maxMemory`) AS `minMaxMemory`, 
    MAX(`p`.`usedMem`) AS `peakUsedMem`, 
    MIN(`p`.`usedMem`) AS `minUsedMem`, 
    MAX(`p`.`availMem`) AS `peakAvailMem`, 
    MIN(`p`.`availMem`) AS `minAvailMem`, 
    MAX(`p`.`numPoweredOnVms`) AS `peakPoweredOnVms`, 
    MIN(`p`.`numPoweredOnVms`) AS `minPoweredOnVms`, 
    (MAX(`p`.`maxMemory`) - MIN(`p`.`maxMemory`)) AS `deltaMaxMemory`, 
    (MAX(`p`.`usedMem`) - MIN(`p`.`usedMem`)) AS `deltaUsedMem`, 
    (MAX(`p`.`availMem`) - MIN(`p`.`availMem`)) AS `deltaAvailMem`, 
    (MAX(`p`.`numPoweredOnVms`) - MIN(`p`.`numPoweredOnVms`)) AS `deltaPoweredOnVms` 
FROM 
    (`vtrend`.`clusters` `c` 
    JOIN `vtrend`.`capacityDataRawPOSH` `p` ON ((`c`.`clusterID` = `p`.`clusterID`))) 
GROUP BY `c`.`clusterName` , DATE_FORMAT(`p`.`insertedTS`, '%Y-%m-%d') 
ORDER BY `c`.`clusterName` 

結果是這樣的:

clusterName,insertedDate,peakMaxMemory,minMaxMemory,peakUsedMem,minUsedMem,peakAvailMem,minAvailMem,peakPoweredOnVms,minPoweredOnVms,deltaMaxMemory,deltaUsedMem,deltaAvailMem,deltaPoweredOnVms 
Some-Cluster,2016-09-20,221,221,111,111,111,111,17,17,0,0,0,0 
Some-Cluster,2016-09-21,221,221,111,111,111,111,17,17,0,0,0,0 
Some-Cluster,2016-09-22,221,221,111,111,111,111,17,17,0,0,0,0 
Some-Cluster,2016-09-23,221,221,111,111,111,111,17,17,0,0,0,0 
Some-Cluster,2016-09-24,221,221,111,111,111,111,17,16,0,0,0,1 
Some-Cluster,2016-09-25,221,221,111,111,111,111,17,17,0,0,0,0 
Some-Cluster,2016-09-26,221,221,111,111,111,111,17,17,0,0,0,0 
Some-Cluster,2016-09-27,221,221,111,111,111,111,17,17,0,0,0,0 
Some-Cluster,2016-09-28,221,221,111,111,111,111,17,15,0,0,0,2 
Some-Cluster,2016-09-29,221,221,111,111,111,111,17,17,0,0,0,0 

所以我試圖完成(和失敗)是在將顯示枯萎numPoweredOnVms數增加或減少的末尾添加列在一天中。由於上面的每條記錄代表整天的分組,每15分鐘輸入一次數據,我希望能夠查看numPoweredOnVms的第一條記錄和日期,並從當天的最後一條記錄中減去並且可以得到一個肯定的(增加)或負的(減少)數,我可以使用IF語句來顯示「增加」或「減少」文本。

這裏的原始數據的樣本:

idcapacityDataRaw,insertedTS,clusterID,totalRamGb,maxMemory,availMem,usedMem,actualUsageRamGb,totalCpuMhz,maxMhz,usedMhz,numPoweredOnVms 
739,"2016-09-20 16:50:12",29,384,221,111,111,111,268032,178688,3394,17 
976,"2016-09-20 21:50:42",29,384,221,111,111,111,268032,178688,4072,17 
1074,"2016-09-20 22:13:07",29,384,221,111,111,111,268032,178688,4683,17 
1172,"2016-09-20 22:35:36",29,384,221,111,111,111,268032,178688,3916,17 
1270,"2016-09-20 22:58:01",29,384,221,111,111,111,268032,178688,3857,17 
1365,"2016-09-20 23:21:06",29,384,221,111,111,111,268032,178688,7867,17 
1463,"2016-09-20 23:43:37",29,384,221,111,111,111,268032,178688,3971,17 
1575,"2016-09-21 00:11:05",29,384,221,111,111,111,268032,178688,8196,17 
2149,"2016-09-21 19:13:33",29,384,221,111,111,111,268032,178688,3758,17 
2495,"2016-09-21 21:01:48",29,384,221,111,111,111,268032,178688,3927,16 

所以基本上我也希望能夠從第一條記錄,當天的最後一條記錄拉numPoweredOnVms和減去它們。現在有趣的部分是如何在多天內爲多個羣集執行此操作?我在想,我可能需要對原始數據做一個單獨的視圖,然後通過記錄來計算該記錄,然後使用該視圖作爲此查詢的後盾,只是不確定。

回答

1

將原始查詢用作子查詢,並讓它返回每天的第一個和最後一個時間戳。然後回到表格中,在每個時間獲取該列的值。

SELECT c.clusterName, p.*, 
     CASE SIGN(plast.numPoweredOnVms > pfirst.numPoweredOnVms) 
      WHEN -1 THEN 'Decrease' 
      WHEN 0 THEN 'No change' 
      ELSE 'Increase' 
     END AS changePoweredOnVms 
FROM vtrend.clusters AS c 
JOIN (
    SELECT 
     clusterID, 
     DATE(`insertedTS`) AS `insertedDate`, 
     MAX(`maxMemory`) AS `peakMaxMemory`, 
     MIN(`maxMemory`) AS `minMaxMemory`, 
     MAX(`usedMem`) AS `peakUsedMem`, 
     MIN(`usedMem`) AS `minUsedMem`, 
     MAX(`availMem`) AS `peakAvailMem`, 
     MIN(`availMem`) AS `minAvailMem`, 
     MAX(`numPoweredOnVms`) AS `peakPoweredOnVms`, 
     MIN(`numPoweredOnVms`) AS `minPoweredOnVms`, 
     (MAX(`maxMemory`) - MIN(`maxMemory`)) AS `deltaMaxMemory`, 
     (MAX(`usedMem`) - MIN(`usedMem`)) AS `deltaUsedMem`, 
     (MAX(`availMem`) - MIN(`availMem`)) AS `deltaAvailMem`, 
     (MAX(`numPoweredOnVms`) - MIN(`numPoweredOnVms`)) AS `deltaPoweredOnVms` 
     MIN(insertedTS) AS firstTS, 
     MAX(insertedTS) AS lastTS 
    FROM `vtrend`.`capacityDataRawPOSH` 
    GROUP BY clusterID, insertedDate) AS p ON p.clusterID = c.clusterID 
JOIN vtrend.capacityDataRawPOSH AS pfirst ON pfirst.clusterID = p.clusterID AND pfirst.insertedTS = p.firstTS 
JOIN vtrend.capacityDataRawPOSH AS plast ON plast.clusterID = p.clusterID AND plast.insertedTS = p.lastTS 

此外,使用DATE(insertedTS)而不是DATE_FORMAT(insertedTS, '%Y-%m-%d')的時間戳轉換爲日期。 %Y-%m-%d是顯示日期時使用的默認格式。

+0

聖牛,不知道從什麼深的裂縫,代碼來自但它做了一個小小的修改的伎倆;加入的子查詢需要包含clusterID列,否則無瑕疵且速度很快!因爲需要添加clusterID列,所以我修改了最初的'p'。*選擇立場以僅包含我想要的'p'行。 好的,現在已經完成了,有時間弄清楚如何從這個角度來看,應該是一個竅門! – JW52761

+0

我最終把子查詢放到了它自己的視圖中,然後將視圖稱爲「p」,並且像魅力一樣工作。真的看了這個後,我現在可以看到它是如何工作的,而且如果它仍然不快,因爲所有人都會出去。 – JW52761