4

テーブル内の次の情報を変換できる単一のクエリを探しています

name:time    :state
a   :10:00 AM:login
b   :10:05 AM:login
a   :10:06 AM:chatting
a   :10:08 AM:Idle
b   :10:11 AM:chatting
a   :10:10 AM:Logout
b   :10:12 AM:Logout

このようなものに (クエリ期間として午前 10 時から午前 10 時 15 分までの時間範囲を指定)

name: State    :Duration
a   : chatting :2 Minutes 
a   : Idle     :2 Minutes
b   : chatting :1 Minute

これはSQLを使用してのみ行うことができますか? Informix バージョン 11.5 を使用しています

4

2 に答える 2

3

SQL のみを使用して実行できると確信しています。クエリを作成するにはかなりの時間がかかります。完了したら編集します。私が考える基本的な手順は、最初にそれぞれにかかる時間を計算することです(各エントリを取得して次のエントリに結合し、時間差を見つけるために減算することによって実行されます)。次に、合計を含む単純なgroup by句が簡単に取得されますあなたが説明した形にそれを。

編集:ここで私が思いついたもの

SELECT l.userid, l.state, SUM(t.minutes) AS duration
FROM Log l 
INNER JOIN (
    SELECT l1.id, (l2.time - l1.time) AS minutes
    FROM Log l1, Log l2
    WHERE l2.time == ( 
        -- find the next entry --
        SELECT TOP 1 ls.time
        FROM Log ls
        WHERE ls.Time > l1.Time && ls.userid = l1.userid
        ORDER BY ls.Time
    )
) t ON l.id == t.id
GROUP BY l.userid, l.state
ORDER BY l.userid

これは半疑似コードです。すべてのテーブル名とものを作成しました。ある時間を別の時間から減算することはできません。おそらく DATEDIFF 関数を使用することになります。それ以外にも、それがその要点だと思います。SQL は最も素晴らしい言語の 1 つだと思います。わずかなコードでほとんど何でも実行できます。

于 2009-01-28T10:38:56.447 に答える