2017-08-11 22 views
0

私はこのようになりますテーブルがあります。関連付けるイベント

userid | time | event 
----------------------------- 
user1 | time1 | sit_down1 
user1 | time2 | eat1 
user1 | time3 | eat2 
user1 | time4 | sit_down2 
user1 | time5 | eat3 
user1 | time6 | eat4 
user1 | time7 | eat5 

...というように、実際のユーザーとしてではなく、時系列順にグループ化されていない多くのユーザーのために。私がしたいのは、食事イベントを最近の座っているイベントに関連付ける新しいテーブルを作成することです。

は、このように:

user1 time1 sit_down1 time2 eat1 
user1 time1 sit_down1 time3 eat2 
user1 time4 sit_down2 time5 eat3 
user1 time4 sit_down2 time6 eat4 
user1 time4 sit_down2 time7 eat5 

自己がなければならないように感じはどこかここでユーザーIDに参加し、私は多くのことを試してみたが、それを得るように見えることはできません。 TIA ..


このコードは動作しているようです。 Smitの優れたレスポンスも正しいかもしれません。よく分かりません。私はこの提案をステップバイステップで実行しようと試みることでこのコードを手に入れました。この段階で私が望んでいたものを手に入れていたことに気付きました。しかし、提案されたコードは、関連していた「食べる」イベントには遅すぎる「座る」イベントを起こしているように見えました。

明らかに、私のスポットチェックが正しく、このコードが機能するなら、「lastsit」(Smitのバージョンではtime2)の唯一の使用が選択されます。 dbはすべての「座っている」イベントを循環し、後続のすべての「食べる」イベント(@AND all_eats.time > all_sits.time)に関連付けると想像していますが、その次の「座る」が考慮されるときにはほとんどのアソシエーションが上書きされます。私は学ぶべきことがたくさんある。

SELECT all_eats.user_id, 
     all_eats.action as eat, 
     all_eats.time as eattime, 
     max(all_sits.time) as lastsit 
     FROM (SELECT * FROM events AS events1 
       WHERE events1.action like '%eat%') as all_eats 
     JOIN (SELECT * FROM events AS events2 
       WHERE events2.action like '%sit%') as all_sits 
      ON all_eats.user_id = all_sits.user_id 
      AND all_eats.time > all_sits.time 
      GROUP BY all_eats.user_id, 
        all_eats.action, 
        all_eats.time 
      ORDER BY all_eats.user_id, 
        all_eats.time, 
        all_eats.action 
私はT-SQLで上記に書いたが、postgreするように容易に変換可能でなければならない(または誰かが編集を提案することができます)
+1

これはどのタイプのデータベース(Oracle、SQL Server、MySQLなど)ですか? 'time'カラムのデータ型は? –

+0

postgres dbと時刻は日付の種類です。それらの詳細を見逃してしまって残念です。 – paszoon

+0

**あなたの質問に 'postgresql' **タグ**を**追加**してください! –

答えて

0
SELECT e3.userid, 
       e4.timecolumn, 
       e4.eventcolumn, 
       e3.timecolumn, 
       e3.eventcolumn 
FROM   (SELECT t1.eventcolumn, 
               Max(t2.timecolumn) AS time2 
        FROM   (SELECT * 
                FROM   events AS e1 
                WHERE  e1.eventcolumn LIKE N'eat%') AS t1 
               JOIN (SELECT * 
                     FROM   events AS e2 
                     WHERE  e2.eventcolumn LIKE N'sit%') AS t2 
                 ON t1.userid = t2.userid 
                    AND t1.timecolumn > t2.timecolumn 
        GROUP  BY t1.eventcolumn) AS t3 
       JOIN events AS e3 
         ON e3.eventcolumn = t3.eventcolumn 
       JOIN events AS e4 
         ON e4.timecolumn = t3.time2  

。すべてのデータ型は文字列とみなされましたが、クエリに固有のデータ型はありません。

最も重要な部分は、それぞれの食事のための座りの時間を把握することです。それは食べる時よりも時間が短い、座りの最高の時間です。グループを使って解決することができます。だから、& sit_downを食べるための2つの中間テーブルを作成して、それぞれの食べるためにあなたが食事の前に発生していた必要がありますsit_downを得ることができるように、次に、最高のsit_downを把握するためにグループ分けします。 sit_down時間のマッピングを食べたら、必要なデータを入力するためにテーブルを2回ジョインしてください。

+0

ありがとうSmit。それは正確には機能しませんでしたが、あなたはそれにもかかわらず私をそこに連れて来ました。私は動作するコードで質問を更新します。 – paszoon

+0

上記のクエリでは、入力したものと同じ結果が得られました。それにもかかわらず、私はあなたが解決策を見つけてうれしいです。 – Smit

関連する問題