0

3列のテーブルがあります:id、、。updated_atclick_sum

多くの行はまったく同じ値を持っているため、データを単純に取得して合計をグラフに表示updated_atすることは困難です。order by updated_at同じ日付に複数の合計があり、チャートを台無しにしているためです。

私が達成しようとしているのは、次の出力を取得することです。

 update_at | click_sum
-----------+-----------
   date1   |    100
   date2   |     3
   date3   |    235
   date4   |    231

ANDオプションで、単に月である日付ではなく、先月、週、または日を形成する日付のみNOW() - 1

私が作成した現在のクエリは非常に大きく、うまく機能しません。日付でグループ化され(重複した日付は表示されません)SUM()、クリックは正しく行われますが、日付がいつ(先月、週、日)から定義されているかは正しく機能していないようです。

クエリ:(またはまたはまたは$intervalの略)MONTHDAYSECONDWEEK

SELECT d.updated_at, SUM(d.clicks_sum) AS click_sum
FROM aggregated_clicks d
JOIN 
(
     SELECT c.id, MAX(StartOfChains.updated_at) AS ChainStartTime
     FROM aggregated_clicks c
     JOIN 
     (
         SELECT DISTINCT a.updated_at
         FROM aggregated_clicks a
         LEFT JOIN aggregated_clicks b ON (b.updated_at >= a.updated_at - INTERVAL 1 DAY AND b.updated_at < a.updated_at)
         WHERE b.updated_at IS NULL
      ) StartOfChains  ON c.updated_at >= StartOfChains.updated_at
     GROUP BY c.id
) GroupingQuery
ON d.id = GroupingQuery.id
WHERE GroupingQuery.ChainStartTime >= DATE_SUB(NOW(), INTERVAL 1 $interval)
GROUP BY GroupingQuery.ChainStartTime
ORDER BY GroupingQuery.ChainStartTime ASC
4

1 に答える 1

1

多分私はあなたの質問の性質(そしてそれが参照する表)についてあまりにも多くを想定していますが、これはあなたが示したクエリよりもはるかに簡単に行うことができると思います。

完了した最新の月を把握するのはそれほど難しくありません。

それは今月の最初のデートを知ることから始まります-これを使用してください:

date_sub(curdate(), interval (extract(day from curdate())-1) day)

その前月の初日を知るには、次を使用します。

date_sub(date_sub(curdate(), interval extract(day from (curdate())-1) day), interval 1 month)

したがって、その間の日数、つまり最後に完了した月の合計を取得する場合は、次を使用します。

select updated_at, sum(click_sum) from aggregated_clicks
  where updated_at >= date_sub(date_sub(curdate(), interval extract(day from (curdate())-1) day), interval 1 month)
    and updated_at < date_sub(curdate(), interval (extract(day from curdate())-1) day)
  group by updated_at;

最後に完了した週を計算するのも同じくらい簡単です。この例では、日曜日から土曜日の週を想定しています。

ODBC標準が日付番号を定義する方法のため、前の週の終わり(土曜日)を簡単に見つけることができます。

date_sub(curdate(), interval dayofweek(curdate()) day)

その週の初め(日曜日)はその6日前です:

date_sub(curdate(), interval (dayofweek(curdate())+6) day)

したがって、その間の日数、つまり最新の完了した週の合計を取得する場合は、次を使用します。

select updated_at, sum(click_sum) from aggregated_clicks
  where updated_at >= date_sub(curdate(), interval (dayofweek(curdate())+6) day)
    and updated_at <= date_sub(curdate(), interval dayofweek(curdate()) day)
  group by updated_at;

もちろん、最新の完了日に基づいて計算するのは非常に簡単です。

前日の日付を取得するには、次を使用します。

date_sub(curdate(), interval 1 day)

したがって、昨日の合計が必要な場合は、次を使用してください。

select updated_at, sum(click_sum) from aggregated_clicks
  where updated_at = date_sub(curdate(), interval 1 day)
  group by updated_at;

注:MySQL 5.1、YMMVを使用してこれらのクエリをテストしました。

----------

更新:日付列は日時なのでupdated_at、クエリ内のすべての参照を次のように変更するだけです。date(updated_at)

月の場合:

select date(updated_at), sum(click_sum) from aggregated_clicks
  where date(updated_at) >= date_sub(date_sub(curdate(), interval extract(day from (curdate())-1) day), interval 1 month)
    and date(updated_at) < date_sub(curdate(), interval (extract(day from curdate())-1) day)
  group by date(updated_at);

週の場合:

select date(updated_at), sum(click_sum) from aggregated_clicks
  where date(updated_at) >= date_sub(curdate(), interval (dayofweek(curdate())+6) day)
    and date(updated_at) <= date_sub(curdate(), interval dayofweek(curdate()) day)
  group by date(updated_at);

昨日のケース:

select date(updated_at), sum(click_sum) from aggregated_clicks
  where date(updated_at) = date_sub(curdate(), interval 1 day)
  group by date(updated_at);
于 2012-04-07T11:47:10.990 に答える