【问题标题】:Percentage change from previous row when multiple rows have the same date?当多行具有相同的日期时,与上一行相比的百分比变化?
【发布时间】:2014-11-13 15:16:32
【问题描述】:

我有一个查询,它计算比率并在给定的一天为每个小时和服务器返回它们:

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 查询...

【问题讨论】:

    标签: mysql sql function date datetime


    【解决方案1】:

    好的,首先为该查询创建一个视图。我们称之为 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))
    

    【讨论】:

      猜你喜欢
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-24
      • 1970-01-01
      • 1970-01-01
      • 2020-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多