2011-04-28 47 views
0

我需要按会话显示聊天日志,并且会话可能会被每个消息之间30分钟的间隔分隔。根据持续时间对Sqltable中的数据进行分组

这里的样品台

S.No来自至留言时间

  1. 约翰·迈克尔·你好12:00
  2. 迈克尔·约翰·喜达12:01
  3. 迈克尔·约翰·你有12 :40

这里前两条消息是发送1分钟之间的差距。但第三条消息是在39分钟后发送的,所以前两条消息是一条会话,而第三条消息是第二条会话。我怎么能这样分裂。

回答

0

编辑

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 | 
+--------------+------+---------+---------+---------------+---------------------+ 
2

您还标记了你的问题 “甲骨文”,所以这里是一个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。

相关问题