3

毎月のユニーク ユーザーを計算するために、ユニーク ユーザー ID のカウントの合計を計算する必要があり、これは毎日行う必要があります。つまり、今日の場合は今日から 30 日前の合計を表示する必要があり、昨日の場合は昨日の 30 日前から合計を計算する必要があります。

たとえば、今日は 27-04-2013 からカウントを開始し、昨日は 26-04-2013 からカウントを開始する必要があります。テーブル構造は次のようになります。

date        uid   visits
27-04-2013   11     45
27-04-2013   11     45
26-04-2013   11     45
25-04-2013   11     45
24-04-2013   11     45

これは現在の合計のようなものですが、30 日間のみです。

私はDATE_ADD(date,INTERVAL -30 day)このように使用しました

SELECT DISTINCT date,COUNT(uid) FROM tablename 
WHERE DATE_ADD(date,INTERVAL -30 day) AND date GROUP BY date

しかし、このために、このクエリと比較して異なる結果が得られます。

SELECT COUNT( `uID` )
FROM tablename
WHERE date
BETWEEN '2013-04-27'
AND '2013-05-27'

これは COUNT 専用です。カウントの合計を計算する必要があります。

4

2 に答える 2

0

質問からは、これを取得しようとしているのが 1 日分なのか、それとも過去の全日分なのかわかりません。後者の場合は、次の方法があります。

SELECT DATE_ADD(date,INTERVAL n.n day) as thedate,
       COUNT(distinct uid) as numUsers, sum(visits) as totVisits
FROM tablename t cross join
     (select 0 as n union all select 1 union all select 2 union all
      select 3 union all select 4 union all select 5 union all
      . . .
      select 27 union all select 28 union all select 29
     ) n 
group by DATE_ADD(date,INTERVAL n.n day) ;

最初のクエリ:

SELECT DISTINCT date,COUNT(uid)
FROM tablename 
WHERE DATE_ADD(date,INTERVAL -30 day) AND date
GROUP BY date

2つの欠点があります。まず、where句はブール値ではありません。次のような意味だと思います:

where date between DATE_ADD(now(),INTERVAL -30 day) AND now()

また、 をdistinct使用する場合、 は必要ありません (持ってはいけません!) group by

編集:

したがって、これを Fiddle で実行して、データ内の各日の数値が返されることを確認します (30 ではなく 6 日間の履歴)。

SELECT DATE_ADD(mydate, INTERVAL n.n day) as thedate,
       COUNT(distinct uid) as numUsers, sum(visits) as totVisits
FROM tablename t cross join
     (select 0 as n union all select 1 union all select 2 union all
      select 3 union all select 4 union all select 5 
     ) n 
where DATE_ADD(mydate, INTERVAL n.n day) < now()
group by DATE_ADD(mydate, INTERVAL n.n day) ;

ユーザーがいない日付はスキップされます。

于 2013-05-27T12:45:29.043 に答える