0

mysqlに、連続していないIDを持つ100行のテーブルがありますが、日付フィールドで並べ替えることができます。

最も古い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

さらに、新しい行が追加されており、これらの計算は、最新の100行を取得する新しい行の追加ごとに再計算する必要があります。つまり、行1は無視され、行101は100行目になります。

うまくいけば、それは理にかなっています。

これがmysqlにとって重要な場合は、phpもオプションです。

各フィールドの合計が10レコードまたは100レコードに制限されている、いくつかの基本的なselectステートメントを試しましたが、オフセットが増分される制限10オフセット1について考えています。

新しいテーブルまたはビューを作成するオプションがあります。

私の進歩に役立つアイデアやコードを事前に感謝します。

4

2 に答える 2

1

私はあなたが何を望んでいるのか理解していると思いますが、あなたのサンプルクエリは、、、およびを参照してabますc

部分累積合計を取得するには、実際にはシーケンス番号が必要です。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 はテストされていないため、構文エラーがある可能性があります。

于 2013-01-17T15:08:47.767 に答える
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 |
+---+------+
于 2013-01-17T15:14:35.577 に答える