首先對於那個標題感到抱歉,但我不知道如何描述它:從多個列按日期分組?
我正在將會話保存在我的表格中,我想知道每小時的會話數以瞭解有多少會話積極的一天。會話由兩個時間戳指定:開始和結束。
希望你能幫助我。
這裏,我們去: http://sqlfiddle.com/#!2/bfb62/2/0
首先對於那個標題感到抱歉,但我不知道如何描述它:從多個列按日期分組?
我正在將會話保存在我的表格中,我想知道每小時的會話數以瞭解有多少會話積極的一天。會話由兩個時間戳指定:開始和結束。
希望你能幫助我。
這裏,我們去: http://sqlfiddle.com/#!2/bfb62/2/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
注:這些都是未經測試的那麼可能有語法錯誤。
哇謝謝你!但是如果我看一下,我應該也許只是運行24個查詢,而不是構建一個我無法工作的大問題,因爲我不明白:p只是希望有一個小小的技巧來做到這一點。但謝謝你的努力 –
雖然我還是不知道你想如何比較的開始和結束日期,看起來像使用COUNT
,YEAR
,MONTH
,DAY
和HOUR
,你可以拿出你想要的結果。
東西可能與此類似:
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。
你好,謝謝你,但我不認爲這是解決方案。問題是,我也必須檢查結束時間,以確定會話是否在特定時間處於活動狀態。 看到這個例子:http://sqlfiddle.com/#!2/e343d/1/0 這是錯誤的,因爲應該有3,而不是2. –
你想要的結果是什麼?我還沒有完全理解。 – sgeddes
好的,對不起。讓我們拿最後一個sqlfiddle。有3個會話在17:00處於活動狀態,因此XXXX 17:00我希望看到值3.如果您考慮用戶會話,那麼我只想知道有多少用戶只在01:00,02 :00等。 –
好的,這是索引表來拯救的另一個問題。
索引表是每個人都應該在其工具包中使用的東西,最好是在主數據庫中。它是一個帶有一個id int primary key
索引列的表格,其中包含從0到n的連續數字,其中n是一個足以滿足需要的數字,100,000是好的,1,000,000是更好的。你只需要創建一次這個表,但一旦你做了,你會發現它有各種應用程序。
對於您的問題,您需要考慮每個小時,如果我瞭解您的問題,則需要計算在小時結束前開始的每個會話,並且在小時開始之前尚未結束。
這是解決方案的SQL fiddle。
它的作用是使用索引表中已知的序列號(對於這個小提琴只有0到100個 - 僅僅4天以上 - 你可以看到爲什麼你需要一個大n)來鏈接你的數據在頂部和底部的時間。
您可以使用您的模式和數據集創建www.sqlfiddle.com示例嗎? – Martin
當天活躍,你的意思是開始和結束日期都在同一天?或者開始或結束日期? COUNT操作員應該很容易做到。 – sgeddes
對於每個小時,開始時間必須在該小時之前和結束時間之後。我如何在我的where子句中使用它? –