【发布时间】:2011-06-21 14:47:45
【问题描述】:
我是 SQL 新手,不知道如何进行以下查询。当然,我错过了一个非常基本的表达方式,但我自己却找不到。
我有下表,用于存储应用程序日志条目。每个条目都有一个记录时间戳、创建该条目的应用程序的标识符、应用程序实际执行的操作以及该应用程序实例的给定会话的唯一 ID。
item_id item_datetime 应用操作 session_id 1 2011-06-20 19:01:04 开始 23B6C531-6D38-4E47-A887-10B945B48BD9 2 2011-06-20 19:01:05 b 开始 7E6D0F55-4280-46DF-A829-F6821FF028D5 3 2011-06-20 19:03:45 b 工作 7E6D0F55-4280-46DF-A829-F6821FF028D5 4 2011-06-20 19:09:33 一份工作 23B6C531-6D38-4E47-A887-10B945B48BD9 5 2011-06-20 19:27:00 退出 23B6C531-6D38-4E47-A887-10B945B48BD9 6 2011-06-20 19:50:00 c 开始 12345678-1234-4321-1234-109876543210 7 2011-06-20 19:50:01 c 退出 12345678-1234-4321-1234-109876543210 8 2011-06-20 19:50:22 b 退出 7E6D0F55-4280-46DF-A829-F6821FF028D5
在此示例中,有 3 个不同的应用程序“a”、“b”和“c”同时执行,每个会话与其他会话重叠。我需要的是按会话分组的列表,会话(结果组)应按会话开始时间排序。 对于上面的示例表,我希望得到以下结果:
item_id item_datetime 应用操作 session_id 1 2011-06-20 19:01:04 开始 23B6C531-6D38-4E47-A887-10B945B48BD9 4 2011-06-20 19:09:33 一份工作 23B6C531-6D38-4E47-A887-10B945B48BD9 5 2011-06-20 19:27:00 退出 23B6C531-6D38-4E47-A887-10B945B48BD92 2011-06-20 19:01:05 b 开始 7E6D0F55-4280-46DF-A829-F6821FF028D5 3 2011-06-20 19:03:45 b 工作 7E6D0F55-4280-46DF-A829-F6821FF028D5 8 2011-06-20 19:50:22 b 退出 7E6D0F55-4280-46DF-A829-F6821FF028D5
6 2011-06-20 19:50:00 c 开始 12345678-1234-4321-1234-109876543210 7 2011-06-20 19:50:01 c 退出 12345678-1234-4321-1234-109876543210
我尝试使用 order by 进行分组,但问题是结果的排序是基于 session_id 的字母顺序 - 但这不是我需要的,会话 id 的唯一性很重要,它们的“价值”确实没关系。
【问题讨论】:
-
会话 id 的唯一性是什么意思,cos,当您使用 order by 时,值将按字母顺序排序,但随后您将获得所需的结果 rt。即三个会话 id 将在一起,然后将时间添加到 order by 将对您的时间进行排序
-
这是 MySQL 服务器上 MyISAM 类型的表。
-
@Balanivash,关于唯一性,我的意思是:在这种情况下,SID 的值或字母顺序无关紧要(我不一定要显示 SID),这些应该只是基础对整体进行分组。如果我先按 SID 排序,然后按日期排序,那么像 AAAA-... 这样的 session_id 将首先出现,它的 3 个条目一起按日期排序。但是会话 AAAA-... 可能已有 2 年历史,因此任何基于 SID 的字母顺序都是无用的。
标签: sql group-by sql-order-by