web-dev-qa-db-ja.com

日付でグループ化されたMySQLの累積合計

私はこれに関連するいくつかの投稿があることを知っていますが、私のケースは少し異なり、これについていくつかの助けを得たいと思いました。

1日ごとの対話の累積数であるデータをデータベースから取得する必要があります。現在これは私が持っているものです

_SELECT
   e.Date AS e_date,
   count(e.ID) AS num_interactions
FROM example AS e
JOIN example e1 ON e1.Date <= e.Date
GROUP BY e.Date;
_

これの出力は私が望むものに近いですが、私が必要とするものとは正確には同じではありません。私が抱えている問題は、日付がインタラクションが発生した時間と分で保存されるため、group byが日をグループ化しないことです。

これは出力がどのようになるかです。 http://screencast.com/t/N1KFNFyil 12-23で5つの相互作用がありますが、タイムスタンプが異なるためグループ化されません。だから私はタイムスタンプを無視して日だけを見る方法を見つける必要があります。

私がGROUP BY DAY(e.Date)を試した場合、データは日のみでグループ化され(つまり、任意の月の1日に発生したすべてが1つの行にグループ化されます)、出力はまったく希望どおりではありません http ://screencast.com/t/HN6DH3GV63M

GROUP BY DAY(e.Date), MONTH(e.Date)は、月と日で分割していますが、ここでもカウントはオフです。

私はMySQLのエキスパートではないので、足りないものに戸惑っています

14
John Ruddell

新しい回答

最初は、あなたが現在の合計を計算しようとしているとは思いませんでした。これは、次のようになります。

SET @runningTotal = 0;
SELECT 
    e_date,
    num_interactions,
    @runningTotal := @runningTotal + totals.num_interactions AS runningTotal
FROM
(SELECT 
    DATE(eDate) AS e_date,
    COUNT(*) AS num_interactions
FROM example AS e
GROUP BY DATE(e.Date)) totals
ORDER BY e_date;

元の回答

参加しているため、重複が発生している可能性があります。おそらく、e1はいくつかの行に対して複数の一致を持っているため、カウントが膨らんでいます。それか、ジョインでの比較は秒数の比較でもありますが、これは期待したことではありません。

とにかく、日時フィールドを日と月に切り刻む代わりに、時間フィールドから時間を取り除きます。これがその方法です。

SELECT
   DATE(e.Date) AS e_date,
   count(e.ID) AS num_interactions
FROM example AS e
JOIN example e1 ON DATE(e1.Date) <= DATE(e.Date)
GROUP BY DATE(e.Date);
18
clhereistian

私は昨夜何をする必要があるかを理解しました...しかし、私はこれが初めてなので、それを投稿することができませんでした...私が働いたのはこれでした:

SELECT
   DATE(e.Date) AS e_date,
   count(e.ID) AS num_daily_interactions,
   (
      SELECT 
         COUNT(id)
      FROM example 
      WHERE DATE(Date) <= e_date
   ) as total_interactions_per_day
FROM example AS e
GROUP BY e_date;

それはあなたのクエリよりも効率が悪いでしょうか?数千から数十万行が返されるので、1日あたりの数をより効率的に取得した後、pythonで計算を実行するだけでかまいません。

11
John Ruddell