1

I have been looking at several different questions related to hourly average queries but I could not find any that addresses the following.

I have a log table that keeps track on how many times a page is accessed by a user:

ID   USERID   PAGEID  SECNO    DATE

1    123      120     14      6/08/2013 10:07:29 AM
1    124      438     1       6/08/2013 11:00:01 AM
1    123      211     18      6/09/2013 14:07:59 PM
1    123      120     14      6/10/2013 05:07:18 PM
1    124      312     4       6/10/2013 08:04:32 PM
1    128      81      54      6/11/2013 07:02:15 AM

私は2つの異なるクエリを取得しようとしています。次のようなもの:

HOURLY      Count     Average   

12am        0        0
1am         0        0
2am         0        0
3am         0        0
4am         0        0
5am         1        0
6am         0        0
7am         1        0
8am         0        0
9am         0        0
10am        1        0
11am        1        0
12pm        0        0
1pm         0        0
2pm         1        0
3pm         0        0
4pm         0        0
5pm         1        0
6pm         0        0
7pm         0        0
8pm         1        0
9pm         0        0
10pm        0        0
11pm        0        0

2 番目のクエリは次のようになります。

DAY      PERCENTAGE

Monday   10%
Tuesday   16%
Wednesday   14%
Thursday   22%
Friday   21%
Saturday   14%
Sunday   3%

**平均値は単なるサンプルであることに注意してください

これまでのところ、最初のクエリについては次のようなものがあります。

SELECT 
   HOUR(date) AS hourly, 
   Count(*)  
FROM 
   logs
GROUP BY 
   hourly

Count( ) の後にAVG( ) を追加しようとしましたが、うまくいきませんでした。

私のログ テーブルには 1 時間ごとのデータはありませんが、レポートにすべての時間を表示する必要があります。時間が空の場合、値は0です。どうすればそれを達成できますか?

4

2 に答える 2

4

最初のクエリでこれを試してください:

SELECT
    h.hour,
    IFNULL(tmp.the_count,0),
    IFNULL(tmp.the_avg,0)
FROM 
    hourly h
LEFT JOIN (
    SELECT
        hourly,
        SUM(visits) the_count,
        SUM(visits)/COUNT(DISTINCT userid) as the_avg
    FROM (
        SELECT 
           HOUR(date) AS hourly, 
           COUNT(*) as visits,
           userid
        FROM 
           logs
        GROUP BY 
           hourly,
           userid
    ) as tmp
    GROUP BY
        hourly
) as tmp
    ON tmp.hourly = h.hour

2番目のクエリでこれを試してください:

SELECT
    theday,
    IFNULL(percentage,0) as percentage
FROM (
    SELECT  DATE_FORMAT('2013-06-16','%W') as theday UNION
    SELECT  DATE_FORMAT('2013-06-16' - INTERVAL 1 DAY,'%W') as theday UNION
    SELECT  DATE_FORMAT('2013-06-16' - INTERVAL 2 DAY,'%W') as theday UNION
    SELECT  DATE_FORMAT('2013-06-16' - INTERVAL 3 DAY,'%W') as theday UNION
    SELECT  DATE_FORMAT('2013-06-16' - INTERVAL 4 DAY,'%W') as theday UNION
    SELECT  DATE_FORMAT('2013-06-16' - INTERVAL 5 DAY,'%W') as theday UNION
    SELECT  DATE_FORMAT('2013-06-16' - INTERVAL 6 DAY,'%W') as theday 
) as weekt
LEFT JOIN (
    SELECT 
        DATE_FORMAT(date,'%W') AS daily, 
        (COUNT(*)/(SELECT COUNT(*) FROM logs))/100 as percentage
    FROM 
        logs 
    WHERE 
        date >= '2013-06-10'
        AND date <= '2013-06-16'
    GROUP BY 
        daily
) as logdata
    ON logdata.daily = weekt.theday
于 2013-06-12T07:40:26.833 に答える
2

SQL には、何もない状態から 1 時間を「作成」する方法はありません。したがって、簡単な方法は、numbers (number int)必要な数字の表を用意することです (月の場合は 1 ~ 31、年の場合は 1 ~ 366 など)。そのテーブルは、次のようなデータと結合したままにすることができます

select n.number as hour, count(*) as cnt 
from numbers as n
left join logtable as l
on hour(l.date) = n.number
group by n.number

テーブルがなくても「シミュレート」できますが、そのテーブルが役立つ場合がいくつかあります。

于 2013-06-12T07:57:15.063 に答える