私はこのようになりますテーブルがあります。関連付けるイベント
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するように容易に変換可能でなければならない(または誰かが編集を提案することができます)
これはどのタイプのデータベース(Oracle、SQL Server、MySQLなど)ですか? 'time'カラムのデータ型は? –
postgres dbと時刻は日付の種類です。それらの詳細を見逃してしまって残念です。 – paszoon
**あなたの質問に 'postgresql' **タグ**を**追加**してください! –