2017-10-31 10 views
-4

入力表:mySQLを使用して入力テーブルから出力テーブルを取得するには?

Visitor Page Visited  TimeStamp 
A   P1    6:41:21 
A   P1    6:41:35 
A   P2    6:42:54 
A   P2    6:43:53 
A   P1    6:44:09 
A   P1    6:44:54 

私はその開始タイムスタンプとページレベルで(この場合、訪問者「」再びP1にP2、その後、ページP1に起こっているで)お客様の旅を見つけなければなりません(そのページ上の)および終了タイムスタンプ(そのページ上)

各行は、ヒットとして記録されたページ上で訪問者が行う特定のアクティビティであるため、各行はタイムスタンプ付きヒットを表します。

出力テーブルには、次のようになります。

Visitor Page Visited  StartTime EndTime 
A   P1    6:41:21 6:41:35   
A   P2    6:42:54 6:43:53 
A   P1    6:44:09 6:44:54 
+0

この表 –

+0

こんにちは用に定義された任意の主キーがあります。編集ボックスのヘルプでもある「stackexchange homework」のgoogleから[ask]&hitsを読んでください。あなたの宿題はここにはありません。また、「訪問ページレベルでの訪問者の旅」が明確でない場合は、質問を明確に編集してください。文章に数語を詰め込まないでください。 – philipxy

+0

@MKhalidJunaid PKs&FKsを含む制約は、クエリに必要でも十分でもありません。なぜ、いつ/どの行がテーブルに入るのかを知る必要があります。制約はちょうどあなたが推測するのを助ける。あなたが求めている限り、テーブルの意味を尋ねる。 – philipxy

答えて

0

多分これが容易になるだろう。

SELECT Visitor, pageVisited as 'Page Visited', min(timestampTemp) StartTime, 
max(timestampTemp) EndTime from 
(select @pvt:= @pvt+(@pv!=a.pageVisited) pvt,@pv:=a.pageVisited,a.* from 
(select @pv:='', @pvt:=0) vars, testTab a order by visitor,timestampTemp) t 
group by t.pvt, t.visitor; 

http://sqlfiddle.com/#!9/0cca99/1/0

+0

@プネーネ私はあなたがこれを受け入れるのを見ます。複数の訪問者を含むデータセットでこれを試してください(ここで提供したサンプルには1人の訪問者しかいません)。私はそれがその場合にうまくいくかどうか分からない。 – Vasan

1

は、この文字列で検索してください。私はthis素晴らしいブログ記事を使用して質問を作成しました。

基本的には、MySQLのユーザ定義変数を使用して状態変更(「状態」を訪問者+ページの組み合わせとして取得)を追跡し、テーブル全体をタイムスタンプで、次にページと訪問者(つまり状態)。カウンタgnは、状態が変わるたびに1ずつインクリメントします。外部クエリは、単に開始時刻と終了時刻としてタイムスタンプの最小値と最大値を選択し、グループ化はgnとなります。

テストデータのあるテーブルはdummy、ソーステーブルに対応する列はvisitor, pg, visitedです。わかりやすくするために、私はすべての3つの列にcharデータ型を使用し、注文時にタイムスタンプ列を時刻に変換しました。変換の必要性がなくなるdatetime型として格納できます。

今後の参考として、これは「島問題」とも呼ばれます。あなたは他の方法を使用してより多くの解決策を見つけるためにこれをGoogleにすることができます。あなたが私の元データとクエリの出力を確認することができます

SELECT visitor AS Visitor, pg as 'Page Visited', MIN(visited) AS StartTime, max(visited) as EndTime 
FROM (
     SELECT @r := @r + (@state != concat(visitor,concat('->',pg)) OR @state IS NULL) AS gn, 
       @state := concat(visitor,concat('->',pg)) AS sn, 
       s.visitor, convert(s.visited, TIME) as visited, s.pg 
     FROM (
       SELECT @r := 0, 
         @state := NULL 
       ) vars, 
       dummy s 
     ORDER BY 
       convert(visited, TIME), pg, visitor 
     ) q 
group by gn, pg, visitor 

SQLのフィドル:http://sqlfiddle.com/#!9/b41758/4/0

関連する問題