2013-01-12 112 views
1

首先對於那個標題感到抱歉,但我不知道如何描述它:從多個列按日期分組?

我正在將會話保存在我的表格中,我想知道每小時的會話數以瞭解有多少會話積極的一天。會話由兩個時間戳指定:開始和結束。

希望你能幫助我。

這裏,我們去: http://sqlfiddle.com/#!2/bfb62/2/0

+0

您可以使用您的模式和數據集創建www.sqlfiddle.com示例嗎? – Martin

+0

當天活躍,你的意思是開始和結束日期都在同一天?或者開始或結束日期? COUNT操作員應該很容易做到。 – sgeddes

+0

對於每個小時,開始時間必須在該小時之前和結束時間之後。我如何在我的where子句中使用它? –

回答

0

你想要做的事情在MySQL中相當困難。但是,您可以在沒有太多困難的情況下獲得近似值。以下計算在一天內啓動和停止的用戶:

select date(start), hour, 
     sum(case when hours.hour between hour(start) and hours.hour then 1 else 0 
      end) as GoodEstimate    
from sessions s cross join 
    (select 0 as hour union all 
     select 1 union all 
     . . . 
     select 23 
    ) hours 
group by date(start), hour 

當用戶跨度多個天時,查詢會更加困難。這裏有一個方法,即假設存在誰啓動用戶每隔一小時期間:

select thehour, count(*) 
from (select distinct date(start), hour(start), 
      (cast(date(start) as datetime) + interval hour(start) hour as thehour 
     from sessions 
    ) dh left outer join 
    sessions s 
    on s.start <= thehour + interval 1 hour and 
     s.end >= thehour 
group by thehour 

注:這些都是未經測試的那麼可能有語法錯誤。

+0

哇謝謝你!但是如果我看一下,我應該也許只是運行24個查詢,而不是構建一個我無法工作的大問題,因爲我不明白:p只是希望有一個小小的技巧來做到這一點。但謝謝你的努力 –

1

雖然我還是不知道你想如何比較的開始和結束日期,看起來像使用COUNTYEARMONTHDAYHOUR,你可以拿出你想要的結果。

東西可能與此類似:

SELECT COUNT(ID), YEAR(Start), HOUR(Start), DAY(Start), MONTH(Start) 
FROM Sessions 
GROUP BY YEAR(Start), HOUR(Start), DAY(Start), MONTH(Start) 

而且SQL Fiddle

+0

你好,謝謝你,但我不認爲這是解決方案。問題是,我也必須檢查結束時間,以確定會話是否在特定時間處於活動狀態。 看到這個例子:http://sqlfiddle.com/#!2/e343d/1/0 這是錯誤的,因爲應該有3,而不是2. –

+0

你想要的結果是什麼?我還沒有完全理解。 – sgeddes

+0

好的,對不起。讓我們拿最後一個sqlfiddle。有3個會話在17:00處於活動狀態,因此XXXX 17:00我希望看到值3.如果您考慮用戶會話,那麼我只想知道有多少用戶只在01:00,02 :00等。 –

0

好的,這是索引表來拯救的另一個問題。

索引表是每個人都應該在其工具包中使用的東西,最好是在主數據庫中。它是一個帶有一個id int primary key索引列的表格,其中包含從0到n的連續數字,其中n是一個足以滿足需要的數字,100,000是好的,1,000,000是更好的。你只需要創建一次這個表,但一旦你做了,你會發現它有各種應用程序。

對於您的問題,您需要考慮每個小時,如果我瞭解您的問題,則需要計算在小時結束前開始的每個會話,並且在小時開始之前尚未結束。

這是解決方案的SQL fiddle

它的作用是使用索引表中已知的序列號(對於這個小提琴只有0到100個 - 僅僅4天以上 - 你可以看到爲什麼你需要一個大n)來鏈接你的數據在頂部和底部的時間。