2011-06-21 59 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-

我試着組與ORDER BY,但問題是結果的排序是基於SESSION_ID的的字母順序 - 但這不是我需要什麼,會議編號的唯一性是重要的,他們的「價值」並不重要。

+0

對於什麼數據庫? –

+0

什麼意思是會話id,cos的唯一性,當您按值使用order時,將按字母順序進行排序,但您會達到所需的結果rt。即三個會話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

這幾乎可行。一個奇怪的行爲是它會在session_id列中始終返回「0」(我看不出爲什麼)。第二個問題是每個會話只列出1個條目。我修改它通過添加** GROUP BY SESSION_ID **到內部SELECT,像這樣:'( 選擇SESSION_ID ,分鐘(item_datetime)作爲爲MinDate 從YourTable 組由SESSION_ID )sessions' – cactusdev

+0

@cactusdev:你」關於缺少的「group by」權利,我已將它添加到答案中。不知道什麼可能會導致「0」出現在'session_id'列中。 – Andomar

0

就在第

ORDER BY `session_id` ASC , `item_datetime` ASC 

添加到您的SQL qyery

+0

這將根據session_id按字母排序,然後按日期進行排序,但首先出現像AAAA -...這樣的SID,如果首先出現,則可能是ZZZZ -...,可能是在多年前記錄的。我需要最先出現的會議,其中的條目以日期時間排序順序列出。 – cactusdev

+0

then'item by item_datetime'和'group by session_id' – Balanivash

+0

我也試過。謝謝 – cactusdev

1

在我看來,你不想要的分組,但只排序沒有? 所以:

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