2011-06-21 3 views
2

私はSQLを初めて使用しており、以下のクエリを作成する方法を見つけることができませんでした。確かに、私はかなり基本的な表現を見逃していますが、私はそれを自分で見つけることができませんでした。SQL - グループのセッションログのエントリとセッションの開始時間でグループを注文

私はアプリケーションログエントリを格納するために使用される以下の表を持っています。各エントリには、記録のタイムスタンプ、そのエントリを作成したアプリケーションの識別子、アプリケーションが実際に実行したアクション、およびそのアプリケーションインスタンスの特定のセッションの一意のIDがあります。この例では

 
item_id item_datetime  app action session_id 
1 2011-06-20 19:01:04  a start 23B6C531-6D38-4E47-A887-10B945B48BD9 
2 2011-06-20 19:01:05  b start 7E6D0F55-4280-46DF-A829-F6821FF028D5 
3 2011-06-20 19:03:45  b job  7E6D0F55-4280-46DF-A829-F6821FF028D5 
4 2011-06-20 19:09:33  a job  23B6C531-6D38-4E47-A887-10B945B48BD9 
5 2011-06-20 19:27:00  a quit 23B6C531-6D38-4E47-A887-10B945B48BD9 
6 2011-06-20 19:50:00  c start 12345678-1234-4321-1234-
7 2011-06-20 19:50:01  c quit 12345678-1234-4321-1234-
8 2011-06-20 19:50:22  b quit 7E6D0F55-4280-46DF-A829-F6821FF028D5 

は、同時に実行される3つの異なるアプリケーション "A"、 "B" および "C"、他人と重なる各セッションがあります。私が必要とするのは、セッションによってグルーピングされたリストであり、セッション(結果のグループ)はセッションの開始時間順に並べる必要があります。 は、上記の例のテーブルでは、私は結果の下に期待:

 
item_id item_datetime  app action session_id 
1 2011-06-20 19:01:04  a start 23B6C531-6D38-4E47-A887-10B945B48BD9 
4 2011-06-20 19:09:33  a job  23B6C531-6D38-4E47-A887-10B945B48BD9 
5 2011-06-20 19:27:00  a quit 23B6C531-6D38-4E47-A887-10B945B48BD9

2 2011-06-20 19:01:05 b start 7E6D0F55-4280-46DF-A829-F6821FF028D5 3 2011-06-20 19:03:45 b job 7E6D0F55-4280-46DF-A829-F6821FF028D5 8 2011-06-20 19:50:22 b quit 7E6D0F55-4280-46DF-A829-F6821FF028D5

6 2011-06-20 19:50:00 c start 12345678-1234-4321-1234- 7 2011-06-20 19:50:01 c quit 12345678-1234-4321-1234-

私がすることによって順序とすることで、グループを試してみましたが、問題は、結果のソートがSESSION_ID年代のアルファベット順に基づいていることである - しかし、これではありません私が必要とするのは、セッションIDの一意性は重要であり、その "価値"は重要ではありません。

+0

どのようなデータベースですか? –

+0

セッションIDの一意性、つまり、order by orderを使用するとアルファベット順にソートされますが、目的の結果rtを得ることはどういう意味ですか?つまり、3つのセッションIDが一緒になると、オーダーに時間を追加すると時間がソートされます – Balanivash

+0

これはMySQLサーバーのMyISAMタイプのテーブルです。 – cactusdev

答えて

2

サブクエリを使用して、セッションが最初に表示された日付を見つけることができます。セッションを注文することができます:

select yt.item_id 
,  yt.item_datetime 
,  yt.app 
,  yt.action 
,  yt.session_id 
from (
     select session_id 
     ,  min(item_datetime) as MinDate 
     from YourTable 
     group by 
       session_id 
     ) sessions 
left join 
     YourTable yt 
on  yt.session_id = sessions.session_id 
order by 
     session.MinDate 
,  yt.item_datetime 
+0

これはほとんど動作します。 1つの奇妙な振る舞いは、session_idカラムに常に "0"を返すということです(なぜ見ることはできません)。第2の問題は、セッションごとに1つのエントリしかリストしていないということでした。 – cactusdev

+0

@cactusdevをsessions' '( SESSION_ID を選択し、分(item_datetime)MinDateプロパティ としてYourTable グループからのsession_id による):私はこのように、内部SELECTに**のsession_id BY ** GROUPを追加することによって、それを変更します」行方不明のグループについてもう一度、私は答えに加えました。 'session_id'カラムに" 0 "が現れる原因は何も考えられません。 – Andomar

0

ちょうどあなたのSQLのqyeryに

+0

これはsession_idでソートされ、日付でソートされますが、最初に表示されるAAAA ...などのSID、または最初に表示されるZZZZ ...などのSIDが数年前に記録された可能性があります。最初に表示される最新のセッションが必要です。そのエントリは日時順に並べられています。 – cactusdev

+0

それから 'order by item_datetime'と' group by session_id' – Balanivash

+0

私もそれを試してみます。ありがとう – cactusdev

1

あなたがグループ化するだけでなし並べ替えたくないように私には見える句

ORDER BY `session_id` ASC , `item_datetime` ASC 

を追加しますか? So:

SELECT item_id,item_datetime,app,action,session_id 
FROM Table 
ORDER BY app,item_datetime 
+0

いいえ、これは最初にアプリケーションによってエントリを並べ替えるでしょう。私は上記のクエリが適用された約10kエントリーのテーブルを持っていますが、アプリケーションAのエントリの最初の数十のスクリーンページだけが表示されます。しかし、私は、セッションに参加しているセッション(最新のセッションが最初に表示されています)と、関連するセッショングループ内の日付でソートされたエントリーを見たいと思います。 – cactusdev

0

これを試しましたか?

SELECT 
    * 
FROM 
    yourTable 
ORDER BY 
    app, 
    session_id, 
    item_datetime 

ORDER BYだけを使用しようとしたとはいえ、説明したように見えますか?

+0

これは私が必要とするものではありません。アルファベット順に最初にアプリケーション名で並べ替えて並べ替えると、ここで既に終了することができます:session_idでグルーピングされた日付ソートリストが必要です。 – cactusdev