从某个时间戳获取总计

时间:2014-02-17 17:01:54

标签: mysql sql

我有一列时间戳,我希望得到一个结果,我可以看到

  1. 特定日期(added_on_this_date
  2. 的添加条目数量
  3. 以及自开始以来的总金额(total_since_beginning
  4. 我的表:

    added
    ==========
    1392040040
    1392050040
    1392060040
    1392070040
    1392080040
    1392090040
    1392100040
    1392110040
    1392120040
    1392130040
    1392140040
    1392150040
    1392160040
    1392170040
    1392180040
    1392190040
    1392200040
    

    结果如下:

    date       | added_on_this_date | total_since_beginning
    =========================================================
    2014-02-10 |                  4 |                     4
    2014-02-11 |                  9 |                    13
    2014-02-12 |                  4 |                    17
    

    我正在使用此查询,这会给我错误的结果

    SELECT FROM_UNIXTIME(added, '%Y-%m-%d') AS date,
      count(*) AS added_on_this_date,
    
      (SELECT COUNT(*) FROM mytable t2 WHERE t2.added <= t.added) AS total_since_beginning 
    
    FROM mytable t WHERE 1=1 GROUP BY date
    

    为了更好地理解,我创造了一个小提琴:http://sqlfiddle.com/#!2/a72a9/1

2 个答案:

答案 0 :(得分:2)

你的混音时间戳和yyyy-mm-dd日期......

当你按yyyy-mm-dd分组时,你不确定知道将采用哪个时间戳。

你可以做到

SELECT FROM_UNIXTIME(added, '%Y-%m-%d') AS date,
  count(*) AS added_on_this_date,

  (SELECT COUNT(*) FROM mytable t2 WHERE FROM_UNIXTIME(t2.added, '%Y-%m-%d') <= FROM_UNIXTIME(t.added, '%Y-%m-%d')) AS total_since_beginning 

FROM mytable t  GROUP BY date

答案 1 :(得分:1)

使用变量比使用子查询更有效:

select date, added_on_this_date,
       @cumsum := @cumsum + added_on_this_date as total_since_beginning
from (SELECT FROM_UNIXTIME(added, '%Y-%m-%d') AS date,
             count(*) AS added_on_this_date
      FROM mytable t
      WHERE 1=1
      GROUP BY date
     ) d cross join
     (select @cumsum := 0) const
order by date;

编辑(回应评论):

上述查询具有显着的性能优势,因为它聚合了一次数据,这基本上是查询需要完成的所有工作。您可以使用适当的索引优化具有相关子查询的原始公式。不幸的是,一旦相关子查询中的条件在两个表上都使用了一个函数,那么MySQL将无法利用索引(通常)。

因为查询是按date聚合的,所以这应该会更好。