2014-09-19 31 views
3

我有計算比率,並返回他們對每個小時和服務器上的一個給定的一天的查詢:當多行具有相同日期時,從上一行開始的百分比更改?

SELECT a.day, 
     a.hour, 
     Sum(a.gemspurchased), 
     Sum(b.gems), 
     Sum(b.shadowgems), 
     (Sum(b.gems)/Sum(a.gemspurchased))  AS GemRatio, 
     (Sum(b.shadowgems)/Sum(a.gemspurchased)) AS ShadowGemRatio 
FROM (SELECT Date(Date_sub(createddate, INTERVAL 7 hour)) AS day, 
       Hour(Date_sub(createddate, INTERVAL 7 hour)) AS hour, 
       serverid, 
       Sum(gems)         AS GemsPurchased 
     FROM dollartransactions 
     WHERE Date(Date_sub(createddate, INTERVAL 7 hour)) BETWEEN 
       Curdate() - INTERVAL 14 day AND Curdate() 
     GROUP BY 1, 
        2, 
        3) a, 
     /*Gems recorded from DollarTransactions Table after purchasing gem package*/ 
     (SELECT Date(Date_sub(createddate, INTERVAL 7 hour)) AS day, 
       Hour(Date_sub(createddate, INTERVAL 7 hour)) AS hour, 
       serverid, 
       Sum(acceptedamount)       AS Gems, 
       Sum(acceptedshadowamount)     AS ShadowGems 
     FROM gemtransactions 
     WHERE Date(Date_sub(createddate, INTERVAL 7 hour)) BETWEEN 
         Curdate() - INTERVAL 14 day AND Curdate() 
       AND transactiontype IN (990, 2) 
       AND fullfilled = 1 
       AND gemtransactionid >= 130000000 
     GROUP BY 1, 
        2, 
        3) b 
/*Gems & Shadow Gems spent, recorded from GemTransactions Table */ 
WHERE a.day = b.day 
     AND a.serverid = b.serverid 
GROUP BY 1, 
      2 

此代碼返回的比例的組成部分,以及比率本身(其有時空):

day  hour sum(a.GemsPurchased) sum(b.Gems) sum(b.ShadowGems) GemRatio ShadowGemRatio 
9/5/2014 0 472875     465499  60766    0.9844 0.1285 
9/5/2014 1 350960     371092  45408    1.0574 0.1294 
9/5/2014 2 472985     509618  58329    1.0775 0.1233 
9/5/2014 3 1023905     629310  71017    0.6146 0.0694 
9/5/2014 4 1273170     628697  74896    0.4938 0.0588 
9/5/2014 5 998920     637709  64145    0.6384 0.0642 
9/5/2014 6 876470     651451  68977    0.7433 0.0787 
9/5/2014 7 669100     667217  81599    0.9972 0.122 

我希望做的是創造一個第8和第9列,其計算從以前的行百分比變化兩個GemRatio和ShadowGemRatio。我已經看到了其他線程在這裏如何爲特定的查詢做到這一點,但我不能讓它爲我的特定的MySQL查詢工作...

回答

0

好吧先爲該查詢創建一個視圖。讓我們把它叫做V1:

CREATE VIEW V1 AS SELECT 您的查詢這裏;

現在這裏是查詢有比率。我假設一天有24小時。第一行比例變化將爲零。

select now.*, 
CASE 
    WHEN yesterday.gemRatio is null THEN 0 
    ELSE 100*(now.gemRatio-yesterday.gemRatio)/yesterday.gemRatio 
END as gemChange, 
CASE 
    WHEN yesterday.ShadowGemRatio is null THEN 0 
    ELSE 100*(now.ShadowGemRatio-yesterday.ShadowGemRatio)/yesterday.ShadowGemRatio 
END as shadowGemChange 
from v1 now left outer join v1 yesterday on 
((now.day = yesterday.day && now.hour = yesterday.hour+1) || 
(DATEDIFF(now.day,yesterday.day) = 1 && now.hour = 0 && yesterday.hour=23)) 
相關問題