質問

私はフィールドID、PLAYER、TIMESTAMPおよびACTIONとMySQLのテーブルLOGIN_LOGを持っています。 ACTIONは、「ログイン」または「ログアウト」のいずれかになります。ログインのわずか約20%が、添付のログアウト行を有します。ないものについては、私は平均的な期間を計算します。

私は

のようなものと思っています
select avg(LL2.TIMESTAMP - LL1.TIMESTAMP)
from LOGIN_LOG LL1
inner join LOGIN_LOG LL2 on LL1.PLAYER = LL2.PLAYER and LL2.TIMESTAMP > LL1.TIMESTAMP
left join LOGIN_LOG LL3 on LL3.PLAYER = LL1.PLAYER
  and LL3.TIMESTAMP between LL1.TIMESTAMP + 1 and LL2.TIMESTAMP - 1
  and LL3.ACTION = 'login'
where LL1.ACTION = 'login' and LL2.ACTION = 'logout' and isnull(LL3.ID)

これはそれを行うための最善の方法である、またはより効率的なものがある?

役に立ちましたか?

解決

あなたがログインおよびログアウトの記録を見て、他のLOGINが存在しないことを確認する必要があるため、

あなたが持っているデータを考えると、おそらくはるかに速くあなたが何かできることがない(またはLOGOUTは?)同じユーザのレコード両者の間ます。

あるいは、データは(代わりに20%完了の)完全になるように切断は、ログアウトを記録することを確実にする方法を見つけます。ただし、クエリはおそらくまだ基準がすべて満たされていることを確認する必要があり、それはすべてが非常にクエリを助けにはなりません。

あなたはLOGINと対応LOGOUT時間が同じレコードの両方である、あなたは非常にクエリを簡素化できる形式にデータを取得することができます。 SessionManagerのはあなたのためにそれを行う場合、私は明確ではないよ。

他のヒント

あなたがセッションをタイムアウトすることができますSessionManagerのタイプのオブジェクトを持っていますか?タイムアウトがログに記録することができ、あなたはそれから、最後の活動時間とタイムアウト時間を得ることができるからです。

それとも、ウェブサイト/サービスにすべての活動を記録し、したがって、あなたは直接ウェブサイト/サービスの訪問期間を照会し、彼らが行って何の活動を見ることができます。ウェブサイトの場合は、Apacheのログアナライザは、おそらく必要な統計情報を生成することができます。

私はJeeBeeに同意するが、SessionManagerの型オブジェクトへの別の利点は、あなたがsessionEndイベントを処理し、それに積極的に時間とログアウト行を記述することができるということです。この方法は、あなたはおそらく100%添付ログアウト行に20%添付ログアウト行から行くだろう。活動時間のために照会すると、その後、すべてのセッションの些細と一致するであろう。

ユーザーの20%のみが実際にログアウトした場合は、

、この検索はあなたに、各セッションの非常に正確な時間を与えることはありません。平均的なユーザーセッションがどのくらい測るためのより良い方法は、アクション、または平均の間の平均時間がかかることであろう。ページあたりの時間。これは、その後、より正確な時間を与えるために訪問あたりのページ/アクションの平均数を掛けすることができます。

また、あなたは平均を決定することができます。各ページのための時間、その後はそのポイント+彼らの最後のページに費やした平均時間にセッション終了時間=セッション時間を取得します。これは、あなたセッションごとに費やした時間のはるかにきめ細かい(かつ正確な)測定を行います。

与えられたSQLに関しては、あなたが本当に必要以上に複雑であるように思われます。統計的な操作のこの種は、多くの場合、より良いあなたが選択したいずれかの言語のフルパワーを持つことができ、データベース、および統計計算のためのSQLのだけではなく、むしろ複雑な能力

への外部コードでより保守/処理することができ
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top