0

別の既存のテーブル A からの情報に基づいて、新しいテーブル B を作成したいと考えています。MySQL に、時間の範囲を考慮して列 A の値をグループ化し、列 B の値のみを合計する機能があるかどうか疑問に思っています。列 A のグループに基づいています。

テーブル A には、ユーザーのジャーナルのようなイベントのログが格納されます。1 人のユーザーから 1 日に複数のイベントが発生する可能性があります。仮説として、ユーザーが果物をいつ食べるかを追跡していて、1 週間 (7 日間) に何個の果物を食べ、何個のリンゴを食べているかを知りたいとします。

したがって、テーブル BI では、テーブル A の各エントリについて、過去 7 日間の果物とリンゴの総数を数えたいと考えています。

編集:
与えられた情報を単純化しすぎて申し訳ありませんが、私の例を完全に考えていませんでした。

最初はテーブル A しかありません。クエリからテーブル B を作成しようとしています。

推定:

  • ユーザー/ID は、1 日に複数回エントリを記録できます。
  • 合計カウントは、日付と日付の間の ID である必要があります - 7 日
  • 果物の列は、7 日間の果物の合計数を表します (リンゴとバナナは両方とも果物です)。
  • データは 2013 年 9 月 5 日から始まっただけではありません。2000 年までさかのぼることができ、2000 年から 2013 年までのすべての日付で 7 日間のスライディング ウィンドウを使用したいと考えています。

合計カウントは 7 日間のスライディング ウィンドウを超えています

次に例を示します。

Table A:                           

| id | date-time          | apples | banana |     
---------------------------------------------
|  1 | 2013-9-5 08:00:00  |   1    |   1    |  
|  2 | 2013-9-5 09:00:00  |   1    |   0    |   
|  1 | 2013-9-5 16:00:00  |   1    |   0    |  
|  1 | 2013-9-6 08:00:00  |   0    |   1    |    
|  2 | 2013-9-9 08:00:00  |   1    |   1    |  
|  1 | 2013-9-11 08:00:00 |   0    |   1    |   
|  1 | 2013-9-12 08:00:00 |   0    |   1    |   
|  2 | 2013-9-13 08:00:00 |   1    |   1    |  

注: ユーザー 1 は 2013 年 9 月 5 日に 2 つのエントリを記録しました

クエリの後の結果はテーブル B になります。

Table B
| id | date-time          | apples | fruit  |
--------------------------------------------
|  1 | 2013-9-5 08:00:00  |   1    |   2    |
|  2 | 2013-9-5 09:00:00  |   1    |   1    |
|  1 | 2013-9-5 16:00:00  |   2    |   3    |
|  1 | 2013-9-6 08:00:00  |   2    |   4    |
|  2 | 2013-9-9 08:00:00  |   2    |   3    |
|  1 | 2013-9-11 08:00:00 |   2    |   5    |
|  1 | 2013-9-12 08:00:00 |   0    |   3    |
|  2 | 2013-9-13 08:00:00 |   2    |   4    |

2013 年 9 月 12 日にスライディング ウィンドウが移動し、9-6 から 9-12 のみが含まれます。これが、id 1 が 2 個のリンゴの合計から 0 個のリンゴになる理由です。

4

2 に答える 2

0

日付演算を正しく使用するには、データに年数が必要です。それらを追加しました。

あなたのデータには奇妙なことがあります。1 人 1 日につき複数のログ エントリがあるようです。後のログエントリを以前のログエントリの「後」に設定する暗黙の順序を想定しています。SQL と MySQL がそれを行う場合、それは単なる偶然です。テーブル内の行の暗黙的な順序付けはありません。さらに、日付/ID の組み合わせを複製すると、自己結合 (続きを読む) に多くの重複行があり、合計が台無しになります。

したがって、次のように、データの日次サマリー テーブルを作成することから始める必要があります。

    select id, `date`, sum(apples) as apples, sum(banana) as banana
      from fruit
     group by id, `date`

この概要には、1 日あたり ID ごとに最大で 1 行が含まれます。

次に、限定的な外積の自己結合を行う必要があるため、7 日間分の果物を食べます。

select --whatever--
 from (
    -- summary query --
 ) as a  
  join (
    -- same summary query once again
 ) as b   
    on (      a.id = b.id 
         and  b.`date` between a.`date` - interval 6 day AND a.`date`   )

between句はon、7 日間 (今日とその前の 6 日間) を示しています。エイリアスとの結合のテーブルbは 7 日間のものであり、aテーブルは今日のものであることに注意してください。

最後に、指定に従ってその結果を要約する必要があります。結果のクエリはこれです。

  select a.id, a.`date`,
       sum(b.apples) + sum(b.banana) as fruit_last_week,
       a.apples as apple_today
  from (
        select id, `date`, sum(apples) as apples, sum(banana) as banana
          from fruit
         group by id, `date`
     ) as a  
  join (
        select id, `date`, sum(apples) as apples, sum(banana) as banana
          from fruit
         group by id, `date`
     ) as b   on (a.id = b.id and 
                      b.`date` between a.`date` - interval 6 day AND a.`date`   )
  group by a.id, a.`date`, a.apples
  order by a.`date`, a.id

ここにフィドルがあります: http://sqlfiddle.com/#!2/670b2/15/0

于 2013-09-09T19:03:43.230 に答える