2013-06-12 136 views
1

我一直在尋找與小時平均查詢有關的幾個不同的問題,但我找不到以下任何地址。MySql如何獲得小時平均數

我有不斷有多少次頁面被用戶訪問跟蹤日誌表:

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 

,我試圖讓兩個不同的查詢。一個看起來是這樣的:

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 

第二個查詢是這樣的:

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 

我試圖添加AVG()之後Count()但沒有工作。

我的日誌表沒有每個小時的數據,但我仍然需要在我的報告中顯示所有小時數。如果小時爲空,則值爲0.任何想法如何實現?

+0

avg是什麼意思?我的意思是你在什麼領域計算平均值? – Stephan

+0

日誌示例只是一個巨大表格的示例副本。我需要知道用戶訪問頁面的每小時平均值。 – carol1287

回答

3

嘗試此第一查詢:

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 

嘗試此第二個查詢:

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 
+0

嗨Stephan,非常感謝第二個查詢工作正常,但我需要能夠顯示整個星期(7天)的數據,鄙視在一週的任何一天中沒有任何數據。我知道我需要在這裏包含一個左連接,我需要創建一個星期幾的表格,然後做一個左連接,或者有另一種方式,你知道嗎? – carol1287

+0

我已更新查詢,它會顯示本週的結果 – Stephan

+0

非常感謝您的幫助,只顯示我有數據的日子。例如,如果我從'2013年6月1日'選擇'2013年6月7日',並且我沒有'2013年6月4日'的任何數據,我仍然應該能夠看到結果的那一天。 – carol1287

2

SQL有沒有辦法「創造」一個小時無中生有。所以簡單的訣竅是有一個表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 

你可以「模擬」它沒有一個表,但有幾個場合該表是有幫助的。

+0

嗨Flashenpost,非常感謝您的建議。我已經在00:00至23:00之間創建了一個小時表,現在我會嘗試將Stephan的第一個查詢留下,並查看它是否可行 – carol1287