2011-03-12 4 views
2

두 테이블 cpuinfo와 jobinfo가 있습니다. 두 데이터를 모두 사용하여 보고서를 만들고 싶습니다.Mysql은 시간 일치로 결합합니다

탭;

CREATE TABLE `cpuinfo` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `usagetime` datetime DEFAULT NULL, 
    `cpuusage` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `id_UNIQUE` (`id`) 

CREATE TABLE `jobinfo` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `starttime` datetime NOT NULL, 
    `endtime` datetime DEFAULT NULL, 
    `jobname` text NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `id_UNIQUE` (`id`) 

값이 같은

cpuinfo 
id,usagetime,cpuusage 
1,"2011-03-12 11:10:01",40 
2,"2011-03-12 11:10:31",45 
3,"2011-03-12 11:11:01",45 
4,"2011-03-12 11:11:31",43 
5,"2011-03-12 11:12:01",55 
6,"2011-03-12 11:12:31",49 

jobinfo 
id,starttime,endtime,jobname 
1,"2011-03-12 11:10:01","2011-03-12 11:10:08","job a" 
2,"2011-03-12 11:10:05","2011-03-12 11:10:18","job b" 
3,"2011-03-12 11:10:15","2011-03-12 11:10:28","job c" 
4,"2011-03-12 11:10:31","2011-03-12 11:10:38","job d" 
5,"2011-03-12 11:10:45","2011-03-12 11:10:48","job e" 
6,"2011-03-12 11:10:55","2011-03-12 11:10:55","job f" 
7,"2011-03-12 11:11:31","2011-03-12 11:11:43","job d" 
8,"2011-03-12 11:11:45","2011-03-12 11:11:49","job e" 
9,"2011-03-12 11:11:55","2011-03-12 11:11:59","job f" 
10,"2011-03-12 11:12:31","2011-03-12 11:12:43","job d" 
11,"2011-03-12 11:12:45","2011-03-12 11:12:49","job e" 
12,"2011-03-12 11:12:55","2011-03-12 11:12:59","job f" 

내가 찾고 있어요 출력 :

starttime,endtime,jobname,cpuusage 
"2011-03-12 11:10:01","2011-03-12 11:10:08","job a",40 
"2011-03-12 11:10:05","2011-03-12 11:10:18","job b",40 
"2011-03-12 11:10:15","2011-03-12 11:10:28","job c",40 
"2011-03-12 11:10:31","2011-03-12 11:10:38","job d",45 
"2011-03-12 11:10:45","2011-03-12 11:10:48","job e",45 
"2011-03-12 11:10:55","2011-03-12 11:10:55","job f",45 
"2011-03-12 11:11:31","2011-03-12 11:11:43","job d",43 
"2011-03-12 11:11:45","2011-03-12 11:11:49","job e",43 
"2011-03-12 11:11:55","2011-03-12 11:11:59","job f",43 
"2011-03-12 11:12:31","2011-03-12 11:12:43","job d",49 
"2011-03-12 11:12:45","2011-03-12 11:12:49","job e",49 
"2011-03-12 11:12:55","2011-03-12 11:12:59","job f",49 

이 SQL이 제공 일치하지 않는 기본적으로 내가 원하는

select a.starttime, a.endtime, a.jobname,b.cpuusage from jobinfo a 
    left join cpuinfo b on b.usagetime >= a.starttime and b.usagetime <= a.endtime 

를 null로 SQL 값을 모든 일자리와 그 일람을 열거한다. g 작업 시간 동안 cpuusage.

감사 SR

+1

작업 시간 사이에 CPU 사용량이 없을 때 예상되는 결과는 무엇입니까? 그리고 만약 당신이 그 직업 시간에 여러 cpuusage을 가지고 있다면? –

+0

우리는 vmstat 출력에서 ​​가져오고 있습니다. 우리는 값을 가질 것입니다. 시간이 없으면 이전 값을 사용할 수 있습니다. 내가 여러개 있다면 나는 마지막 것을 사용할 수 있습니다. – sfgroups

답변

0

이 시도 :

SELECT j.id, j.starttime, j.endtime, j.jobname, c.cpuusage 
FROM 
(
    SELECT j.id, j.starttime, j.endtime, j.jobname, MAX(c.usagetime) AS usagetime 
    FROM jobinfo AS j 
    LEFT JOIN cpuinfo AS c 
    ON c.usagetime <= j.starttime 
    GROUP BY j.id 
) AS j 
JOIN cpuinfo AS c 
ON j.usagetime = c.usagetime 

이 당신이 원하는 출력을 제공합니다. 각 작업의 시작 시간 전에 cpuusage의 최신 값을 찾습니다. 작업이 실행되는 동안 cpuusage의 변경 사항은 처리하지 않습니다.

+0

그것은 원하는 결과를 주었지만, 각 테이블에 4000 개의 레코드를로드하면 10 분이 걸립니다. – sfgroups

0

결과 집합에 NULL 값을 사용하지 않으려면 NULL 값이 포함 된 행을 생략하면됩니다. 그리고는 INNER 대신 LEFT의 조인을 사용하여 수행 할 수는 가입 : 당신도 행을 생략하지 않으려면

select a.starttime, a.endtime, a.jobname,b.cpuusage from jobinfo a 
    inner join cpuinfo b on b.usagetime >= a.starttime and b.usagetime <= a.endtime 

은 다음과 널 (null)을 대체할지 결정해야하고, 위해 IFNULL를 사용합니다 그. 당신이 0으로 모든 널 (null)을 대체하기를 원한다면 예를 들어, 스크립트는 다음과 같습니다

select a.starttime, a.endtime, a.jobname, ifnull(b.cpuusage, 0) as cpuusage 
from jobinfo a 
    left join cpuinfo b on b.usagetime >= a.starttime and b.usagetime <= a.endtime 

물어 당신이 결과를 어디에가보고 싶어요 방법입니다에 의해 명확하지 않은 한 가지 더 jobinfo의 행과 일치하는 cpuinfo의 행이 두 개 이상 있습니다.

한 가지 방법은 모든 일치 항목을 단순히 출력하는 것이므로 작업에 여러 CPU 이벤트가있는 경우 그에 따라 두 번 이상 나열됩니다.

적절하지 않은 경우 @Mark Byers과 같은 하나의 값 (예 : 가장 최근 값)을 선택할 수 있습니다. 그러나이 경우 일부 CPU 이벤트가 결국 결과 집합에서 제외 될 수 있습니다. 두 이벤트, CPU 및 CPU 이 있었다 B 일 동안

 
     |CPU1    |CPU2   |CPU3 
+--------+------+------+-------+------+-----------+-+------+------- 
|Astart  |Aend |Bstart  |Cstart  |Bend |Cend 

:

여기에 간단한 그림입니다. 후자는 C 직업 중에 일어난 유일한 사건이기도합니다. 모든 작업에 대해 가장 최근의 이벤트 만 선택하면 CPU 은 결과가 나타나지 않습니다. 이는 하나의 작업에서만 발생했기 때문에 가장 최근의 이벤트가 아니기 때문입니다.

작업을 복제하지 않고 모든 이벤트를 포함하는 솔루션은 하나의 열에 모든 이벤트를 값 목록으로 출력하는 것일 수 있습니다.즉 GROUP_CONCAT의 도움으로 해결 될 수있다 : 당신이 볼 수 있듯이 이제 우리가 그들을 연결하기 전에 숫자를 문자열로 변환해야하기 때문에

select 
    a.starttime, a.endtime, a.jobname, 
    group_concat(convert(ifnull(b.cpuusage, 0), char) separator ',') as cpuusage 
from jobinfo a 
    left join cpuinfo b on b.usagetime >= a.starttime and b.usagetime <= a.endtime 

, 우리는 또한, 여기 CONVERT을 사용하고 있습니다.