2014-09-28 2 views
-1

데이터 값이 TIME 형식의 경쟁 시간 랩에서 추출되는 mysql 쿼리에서 얻은 값의 차이를 계산하려고했습니다. 목표는 각 랩의 도착 간 랩타임을 얻는 것입니다. 이 표는 Times입니다.Mysql 그룹 concat 및 빼기 값

id   number   time 
---------+----------------+-------------------- 
1    9    00:00:02.000000 
2    10    00:00:14.000000 
3    9    00:11:09.000000 

MySQL의

SELECT 
    t.number, count(*) as laps, 
    group_concat(time order by t.id separator ',') as times, 
    SEC_TO_TIME(SUM(TIME_TO_SEC(`time`))) as total 
FROM 
    times t 
GROUP BY 
    number 
ORDER BY 
    laps DESC, total ASC 

이 쿼리의 출력은 다음과 같습니다

number  laps   times      total 
-------------------------------------------------------------- 
9    2   00:00:02,00:00:14   00:00:16.000000 
10    1   00:11:09     00:11:09.000000 

지금, 내가 필요한 뺄셈 함께, 각 랩의 시간을 얻을 수 있습니다. 제안 사항을 알려주십시오. 이 결과 덕분에 :

number  laps   times      total 
-------------------------------------------------------------- 
9    2   00:00:02,00:00:12   00:00:14.000000 
10    1   00:11:09     00:11:09.000000 
+1

'서브 루틴은 무엇을 의미합니까? 도메인 로직의 관점에서 무엇을 의미합니까? – zerkms

+0

Datediff 또는 Timediff의 경우,이 경우에는 계산식 (00:00:14 - 00:00:02)을 얻습니다. 예를 들어, –

+0

과 같이 첫 번째 값이 더 큰 경우는 어떻게됩니까? 음의 간격입니까? 3 바퀴가 있다면? 왜 다른 방법으로'14 - 2'을 뺄까요? – zerkms

답변

1

당신은 총 시간을 저장하고 랩타임을 계산하려고합니다. 이를 수행하는 한 가지 방법은 하위 쿼리를 사용하는 것입니다.

SELECT t.number, COUNT(1) laps, 
    GROUP_CONCAT(SEC_TO_TIME(time) ORDER BY t.id) times, 
    SEC_TO_TIME(SUM(time)) total 
FROM (
    SELECT t1.id, t1.number, 
    TIME_TO_SEC(t1.time) - COALESCE(SUM(TIME_TO_SEC(t2.time)), 0) time 
    FROM times t1 
    LEFT JOIN times t2 ON t1.number = t2.number AND t2.id < t1.id 
    GROUP BY t1.id, t1.number, t1.time 
) t 
GROUP BY number 

서브 쿼리 각 무릎의 단부의 총 시간으로부터 작은 번호와 동일한 번호의 모든 시간을 감산함으로써 랩타임을 계산한다. 외부 쿼리는 찾고있는 형식으로 랩타임을 포맷합니다.

An SQLfiddle to test with.

+0

감사합니다. 요아킴 ¡ ¡ 솔루션입니다 : 감사합니다 마스터 –