我需要按会话显示聊天日志,并且会话可能会被每个消息之间30分钟的间隔分隔。根据持续时间对Sqltable中的数据进行分组
这里的样品台
S.No来自至留言时间
- 约翰·迈克尔·你好12:00
- 迈克尔·约翰·喜达12:01
- 迈克尔·约翰·你有12 :40
这里前两条消息是发送1分钟之间的差距。但第三条消息是在39分钟后发送的,所以前两条消息是一条会话,而第三条消息是第二条会话。我怎么能这样分裂。
我需要按会话显示聊天日志,并且会话可能会被每个消息之间30分钟的间隔分隔。根据持续时间对Sqltable中的数据进行分组
这里的样品台
S.No来自至留言时间
这里前两条消息是发送1分钟之间的差距。但第三条消息是在39分钟后发送的,所以前两条消息是一条会话,而第三条消息是第二条会话。我怎么能这样分裂。
编辑
MySQL版本:
CREATE TABLE messages(
S_NO INT(11) NOT NULL,
S_FROM VARCHAR(255) DEFAULT NULL,
S_TO VARCHAR(255) DEFAULT NULL,
MESSAGE VARCHAR(255) DEFAULT NULL,
S_TIME DATETIME DEFAULT NULL,
PRIMARY KEY (S_NO)
);
INSERT INTO messages VALUES
(1, 'John', 'Michael', 'hello', '2011-04-28 12:00:00'),
(2, 'Michael', 'John', 'hi da', '2011-04-28 12:01:00'),
(3, 'Michael', 'John', 'are you there', '2011-04-28 12:40:00'),
(4, 'Michael', 'Alan', 'hi', '2011-04-28 14:15:00'),
(5, 'Alan', 'Michael', 'bye', '2011-04-28 14:41:00');
SET @group_number = 0;
SET @prev_time = NULL;
SET @temp_time = NULL;
SELECT group_number, s_no, s_from, s_to, message, s_time FROM (
SELECT
m.*,
@temp:[email protected]_time,
@prev_time:=(SELECT MAX(S_TIME) FROM messages WHERE S_TIME < m.S_TIME) prev_time,
TIMESTAMPDIFF(MINUTE, @prev_time, S_TIME),
@group_number:=CASE WHEN @prev_time IS NULL THEN 1 WHEN @[email protected]_time OR TIMESTAMPDIFF(MINUTE, @prev_time, S_TIME) < 30 THEN @group_number ELSE @group_number + 1 END group_number
FROM messages m
ORDER BY m.S_TIME) t;
+--------------+------+---------+---------+---------------+---------------------+
| group_number | s_no | s_from | s_to | message | s_time |
+--------------+------+---------+---------+---------------+---------------------+
| 1 | 1 | John | Michael | hello | 2011-04-28 12:00:00 |
| 1 | 2 | Michael | John | hi da | 2011-04-28 12:01:00 |
| 2 | 3 | Michael | John | are you there | 2011-04-28 12:40:00 |
| 3 | 4 | Michael | Alan | hi | 2011-04-28 14:15:00 |
| 3 | 5 | Alan | Michael | bye | 2011-04-28 14:41:00 |
+--------------+------+---------+---------+---------------+---------------------+
您还标记了你的问题 “甲骨文”,所以这里是一个Oracle的解决方案。在接下来的查询,你可以看到别名“GRP”,你可以用它来属于共同组行的表达式:
SQL> select s_no
2 , s_from
3 , s_to
4 , message
5 , s_time
6 , case
7 when nvl(lag(s_time) over (partition by least(s_from,s_to),greatest(s_from,s_to) order by s_time,s_no),s_time)
8 > s_time - interval '30' minute
9 then
10 first_value(s_time) over (partition by least(s_from,s_to),greatest(s_from,s_to) order by s_time,s_no)
11 else
12 s_time
13 end grp
14 from messages
15 order by s_no
16/
S_NO S_FROM S_TO MESSAGE S_TIME GRP
---------- ------- ------- ------------- ------------------- -------------------
1 John Michael hello 28-04-2011 12:00:00 28-04-2011 12:00:00
2 Michael John hi da 28-04-2011 12:01:00 28-04-2011 12:00:00
3 Michael John are you there 28-04-2011 12:40:00 28-04-2011 12:40:00
4 Michael Alan hi 28-04-2011 12:15:00 28-04-2011 12:15:00
5 Alan Michael bye 28-04-2011 12:18:00 28-04-2011 12:15:00
5 rows selected.
,这里是一个例子,如何您可以使用分组表达式创建chatlog:
SQL> select min(s_no) s_no_from
2 , max(s_no) s_no_to
3 , least(s_from,s_to) participant1
4 , greatest(s_from,s_to) participant2
5 , min(s_time) time_from
6 , max(s_time) time_to
7 from (select s_no
8 , s_from
9 , s_to
10 , message
11 , s_time
12 , case
13 when nvl(lag(s_time) over (partition by least(s_from,s_to),greatest(s_from,s_to) order by s_time,s_no),s_time)
14 > s_time - interval '30' minute
15 then
16 first_value(s_time) over (partition by least(s_from,s_to),greatest(s_from,s_to) order by s_time,s_no)
17 else
18 s_time
19 end grp
20 from messages
21 )
22 group by least(s_from,s_to)
23 , greatest(s_from,s_to)
24 , grp
25 order by min(s_time)
26/
S_NO_FROM S_NO_TO PARTICI PARTICI TIME_FROM TIME_TO
---------- ---------- ------- ------- ------------------- -------------------
1 2 John Michael 28-04-2011 12:00:00 28-04-2011 12:01:00
4 5 Alan Michael 28-04-2011 12:15:00 28-04-2011 12:18:00
3 3 John Michael 28-04-2011 12:40:00 28-04-2011 12:40:00
3 rows selected.
Regards,
Rob。