2013-01-17 33 views
0

我在mysql中有一個表,它有100行,它們不是連續的,但可以按日期字段排序。第一個x行數的字段總和,偏移量+1每個後續行

我需要產生一個查詢,選擇10個最舊的記錄的字段總和 ,然後從記錄2到記錄11的字段總和等等,直到我達到90-100這些結果將按第一列是一個數字,顯示它在計算中的位置。

例如:

Record_id Sum(field-a) sum(field-b) sum(field-c) rows used: 
group1  6   3    1    1-10 
group2  7   3    0    2-11 
group3  7   2    1    3-12 

此外新行被添加,並且這些計算將需要在每個新行addtion被recaclulated利用最新100行即第1行是忽略行101成爲第100行。

希望這是有道理的。

如果這是多的MySQL和PHP也是一種選擇太

我已經嘗試了一些基本的select語句與資金用於各領域,限於10個記錄或100條記錄,我想限制10偏移量1,然後增加偏移量。

我可以選擇創建新的表格或視圖。

提前感謝任何想法或代碼,可以幫助我進步。

回答

1

我想我明白你想要什麼,但你的示例查詢引用a,bc

要得到部分累計和,你確實需要一個序列號。在MySQL中,您可以使用相關的子查詢來獲得此信息。其餘的是自我連接,然後是聚合:

select concat('group', t.seqnum), sum(t.field) as sum, 
     MIN(t2.seqnum) as firstrow, max(t2.seqnum) as lastrow 
from (select t.*, 
      (select count(*) from t t2 where t2.date <= t.date) as seqnum 
     from t 
    ) t join 
    (select t.*, 
      (select count(*) from t t2 where t2.date <= t.date) as seqnum 
     from t 
    ) t2 
    on t2.seqnum between t.seqnum and t.seqnum + 10 
group by t.seqnum 

注意:此SQL尚未經過測試,因此可能有語法錯誤。

+0

爲清楚起見惋惜:應該只是一個場,場B和場C,他們都在同一張桌子上 – ChelseaStats

1

考慮這個例子。該查詢返回每行加上前面3行的總和。我使用的是一系列連續的這個例子的數字,但該技術的工作只是你的桌子上一樣...

SELECT * FROM ints; 
+---+ 
| i | 
+---+ 
| 0 | 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 
| 9 | 
+---+ 

SELECT a.i 
    , SUM(b.i) ttl 
    FROM 
    (SELECT x.*, COUNT(*) rank FROM ints x JOIN ints y ON y.i <= x.i GROUP BY i) a 
    JOIN 
    (SELECT x.*, COUNT(*) rank FROM ints x JOIN ints y ON y.i <= x.i GROUP BY i) b 
    ON b.rank BETWEEN a.rank-3 AND a.rank 
GROUP 
    BY a.i; 
+---+------+ 
| i | ttl | 
+---+------+ 
| 0 | 0 | 
| 1 | 1 | 
| 2 | 3 | 
| 3 | 6 | 
| 4 | 10 | 
| 5 | 14 | 
| 6 | 18 | 
| 7 | 22 | 
| 8 | 26 | 
| 9 | 30 | 
+---+------+ 
相關問題