2015-01-05 4 views
4

이 같은 테이블 뭔가있어?MySQL의 집계 데이터는 IN, OUT 시간

나는, ... 출력으로 나는

내가 일부 사용자 지정 기능을 시도 ... TOTAL_TIMEIN 주어진 URL의 OUT 사이의 모든 시간의 합이 될 것 UID 테이블, URL, TOTAL_TIME을하고 싶은 말은 하지만 운이없는 ...

예 입력 (간체 타임 스탬프는 내가 무슨 뜻인지 보여) :

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 

그래서 우리는 단순히 아웃을 확인하지 않고 IN에서 계산 canno't ... ONE URLIN - OUTIN 또는 IN - OUT 또는 기타OUT 끊어진 것 WHERE 거기 CASE를 할 수 있음 (확실됩니다) 있습니다 사이트 일치

13|www.gógle.koń|14 
13|http://www.pr0nstaff.meh/tiny_leg_finger|1000 
+0

주요 문제는 해결책 자체가 아닙니다. 거기에 30GB의 데이터가 있습니다 ... –

답변

0

이 시도 : (UUID = 13에 대한) 예를 들어, 입력

출력해야

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; 
+0

다음과 같은 상황에 적합한 지 확실하지 않습니다 : IN1 www .com OUT1 www.com IN2 www.com OUT2 www.com ... IN1에서 OUT2로 계산됩니다. 그렇지 않습니까? –

+0

귀하의 요구에 맞게 편집 된 질문 –

1

이 시도하지만, OUT은 항상이없는 IN/있을지, 슈어 아니에요 더블. 그래서 확인해주세요.

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; 
+0

OUT이없는 IN이 있거나 IN이없는 OUT에 대해서는 확실하지 않을 수도 있지만, 그런 경우에는 다른 IN을 지나면 최신 날짜와 날짜가 걸릴 것입니다 IN 첫 번째 OUT 전에. 예를 들어, IN IN OUT은 가장 최근의 IN과 첫 번째 OUT을 취해야하지만 IN OUT OUT IN IN은 IN IN OUT OUT IN IN을 먼저 건너 뛰고 IN IN OUT을 건너 뛰고 마지막 IN IN OUT을 계산해야합니다. 이 경우 다소 복잡하지만 자연 스럽습니다. –