SQL - 组会话日志条目,并按会话开始时间对组进行排序

时间:2011-06-21 14:47:46

标签: sql group-by sql-order-by

我是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-109876543210
7   2011-06-20 19:50:01     c   quit    12345678-1234-4321-1234-109876543210
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-109876543210 7 2011-06-20 19:50:01 c quit 12345678-1234-4321-1234-109876543210

我尝试按顺序分组,但问题是结果的排序是基于session_id的字母顺序 - 但这不是我需要的,会话ID的唯一性是重要的,它们的“值”是无所谓。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

在我看来,你不想分组但只是排序没有? 所以:

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

答案 2 :(得分:0)

只需添加条款

即可
ORDER BY `session_id` ASC , `item_datetime` ASC

到您的SQL查询

答案 3 :(得分:0)

你尝试过这样的事吗?

SELECT
  *
FROM
  yourTable
ORDER BY
  app,
  session_id,
  item_datetime

这似乎是你所描述的,虽然你说你曾尝试过只使用ORDER BY?