MySQL聚合数据输入、输出时间

MySQL聚合数据输入、输出时间,mysql,sql,datetime,select,group-by,Mysql,Sql,Datetime,Select,Group By,我在桌上得到了这样的东西: ID | UID | ACTION | URL | TIMESTAMP 在哪里 ID - primary key UID - user id ACTION - IN or OUT URL - action URL TIMESTAMP - action TIMESTAMP 如何通过一个查询聚合所有数据 我是说。。。作为输出,我想要一个UID,URL,TOTAL_TIME的表,其中TOTAL_TIME是给定URL内外所有时间的总和 我尝试了一些自定义函数,但运气不好

我在桌上得到了这样的东西:

ID | UID | ACTION | URL | TIMESTAMP
在哪里

ID - primary key
UID - user id
ACTION - IN or OUT
URL - action URL
TIMESTAMP - action TIMESTAMP
如何通过一个查询聚合所有数据

我是说。。。作为输出,我想要一个UID,URL,TOTAL_TIME的表,其中TOTAL_TIME是给定URL内外所有时间的总和

我尝试了一些自定义函数,但运气不好

简化输入时间戳示例,以显示我的意思:

1|13|IN|http://www.gógle.koń|1
2|13|OUT|http://www.gógle.koń|5
...
13454|13|IN|http://www.gógle.koń|550
...
13465|13|OUT|http://www.gógle.koń|600
...
243252|13|IN|http://www.pr0nstaff.meh|tiny_leg_finger|1200
...
245431|13|OUT|http://www.pr0nstaff.meh/tiny_leg_finger|2200
请注意,可能会有这样的情况,而且肯定会有这样的情况:一个URL的输入输出会被另一个URL的输入输出或输出打破 ... 因此,我们不能在不检查站点匹配的情况下简单地从内到外计数

UUID=13的输出(例如输入)应为:

13|www.gógle.koń|14
13|http://www.pr0nstaff.meh/tiny_leg_finger|1000
试试这个:

SELECT UID, URL, TIMESTAMPDIFF(HOUR, InTime, OutTime) AS TOTAL_TIME 
FROM (SELECT UID, URL, 
             MAX(CASE WHEN ACTION = 'IN' THEN TIMESTAMP ELSE NULL END) InTime, 
             MAX(CASE WHEN ACTION = 'OUT' THEN TIMESTAMP ELSE NULL END) OutTime
      FROM tableA 
      GROUP BY UID, URL
    ) AS A;

试试这个,但我不是舒尔,如果输入/输出不总是双精度的话。所以,请检查

CREATE TABLE test1 (
 id INT NOT NULL,
 uid INT NOT NULL,
 action VARCHAR(3),
 url varchar(100),
 timestamp1 TIMESTAMP
);

INSERT INTO test1 VALUES
( 1 , 13 , 'IN', 'www.go.com', '2015-01-07 08:00:00'),
( 2 , 13 , 'OUT', 'www.go.com', '2015-01-07 09:00:00'),
( 3 , 14 , 'IN', 'www.go2.com', '2015-01-07 08:30:00'),
( 4 , 14 , 'OUT', 'www.go2.com', '2015-01-07 09:00:00'),
( 5 , 15 , 'IN', 'www.go3.com', '2015-01-07 09:00:00'),
( 6 , 16 , 'OUT', 'www.go3.com', '2015-01-07 09:00:00');


SELECT i.uid,i.url,SUM(TIMESTAMPDIFF(minute, i.timestamp1, o.timestamp1)) AS diff_hour
FROM   (SELECT id,uid,url,timestamp1
        FROM   test1
        WHERE  action = 'IN') i
JOIN (SELECT id,uid,url,timestamp1
        FROM   test1
       WHERE  action = 'OUT') o
  ON i.uid = o.uid
 AND i.url = o.url
 AND i.id < o.id
GROUP  BY i.uid,i.url
ORDER  BY i.uid,i.url;

主要问题是速度,而不是解决方案本身。。。那里有大约30GB的数据…不确定它是否适合这样的情况:1 www.com out 1 www.com 2 www.com out 2 www.com。。。这将从1算到2,不是吗?编辑问题以满足您的需要,Thanx可能有输入而无输出,不确定输出而无输入,但可能不。。。在这种情况下,在另一个输入之后,应该从最后一个输入到第一个输出。例如,IN-IN-OUT应采用最新的输入和最先进的输出,但IN-OUT-IN-OUT应采用最先进、最先进、不带输入的跳出,然后计算最后一对输入输出。有点复杂,但在这种情况下有点自然。