2014-02-17 51 views
1

我有時間戳列,我想有一個結果,我可以看到獲得總從某個時間戳

  1. 添加的條目的數量爲某一特定日期(added_on_this_date
  2. added 
    ========== 
    1392040040 
    1392050040 
    1392060040 
    1392070040 
    1392080040 
    1392090040 
    1392100040 
    1392110040 
    1392120040 
    1392130040 
    1392140040 
    1392150040 
    1392160040 
    1392170040 
    1392180040 
    1392190040 
    1392200040 
    
    :從一開始(total_since_beginning

我的表筆

結果應該是這樣的:

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

調音時間戳和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 
+0

謝謝,不知道我可以從'FROM_UNIXTIME'比較輸出! – Xaver

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彙總的,所以這應該會更好。

+0

此方法對@方法有什麼優勢?RaphaëlAlthaus? – Xaver