まず第一にそのタイトルを申し訳ありませんが、私はそれをどのように説明するのか分かりません:
テーブルにセッションを保存しています。1時間あたりのセッション数を取得して、1日にアクティブだったセッションの数を確認したいと思います。セッションは、開始と終了の2つのタイムスタンプで指定されます。
うまくいけば、あなたは私を助けることができます。
まず第一にそのタイトルを申し訳ありませんが、私はそれをどのように説明するのか分かりません:
テーブルにセッションを保存しています。1時間あたりのセッション数を取得して、1日にアクティブだったセッションの数を確認したいと思います。セッションは、開始と終了の2つのタイムスタンプで指定されます。
うまくいけば、あなたは私を助けることができます。
開始日と終了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フィドル。
あなたがやりたいことはMySQLではかなり難しいです。ただし、それほど困難なく近似値を取得できます。以下は、1日以内に開始および停止するユーザーをカウントします。
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
ユーザーが複数日にわたる場合、クエリはより困難になります。これが1つのアプローチであり、1時間ごとに開始するユーザーが存在することを前提としています。
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
注:これらはテストされていないため、構文エラーが発生する可能性があります。
OK、これはインデックステーブルが助けになるもう1つの問題です。
インデックステーブルは、誰もがツールキット、できればマスターデータベースに含める必要があるものです。これは、0からnまでの連続番号を含む単一のid int primary key
インデックス付き列を持つテーブルです。nは必要なことを実行するのに十分な大きさの数値であり、100,000が適切であり、1,000,000がより適切です。このテーブルを作成する必要があるのは1回だけですが、作成すると、あらゆる種類のアプリケーションが含まれていることがわかります。
問題については、1時間ごとに検討する必要があります。問題を理解している場合は、1時間の終わりより前に開始され、その時間が始まる前に終了していないすべてのセッションをカウントする必要があります。
これがソリューションのSQLフィドルです。
インデックステーブルの既知の連続番号(このフィドルでは0から100のみ-4日強-大きなnが必要な理由がわかります)を使用して、時間の上下のデータにリンクします。