2014-06-10 3 views
2

회귀 테스트를 수행하는 빌드 프로세스의 일부로 CPU 사용 경향을 표시하는 작업이 주어졌습니다.MySQL 데이터베이스 테이블에 대해이 쿼리를 수행하는 방법은 무엇입니까?

각 개별 테스트 케이스 실행에는 테이블 RegrCaseResult에 레코드가 있습니다.

id projectName ProjectType returnCode startTime endTime   totalMetrics 

1 'first'  'someType' 16   'someTime' 'someOtherTime' 222 

RegrCaseResult.totalMetrics가 ThreadMetrics.id을 통해 ThreadMetrics라는 다른 테이블에 연결하는 특수 키 경우 : RegrCaseResult 테이블은 다음과 같이 보인다. 여기

이 ThreadMetrics이 모양을 어떻게 다음 compnentName '작업 합계'와

id componentType componentName cpuTime linkId 

1 'Job Totals' 'Job Totals' 'totalTime' 34223 
2 'parser1'  'parser1'  'time1'  null 
3 'parser2'  'generator1' 'time2'  null 
4 'generator1' 'generator1' 'time3'  null 
------------------------------------------------------ 
5 'Job Totals' 'Jot Totals' 'totalTime' 9899 
... 

행은 RegrCaseResult 테이블에서 totalMetrics가 연결되고 '을 totalTime가'정말 오전에 원하는 것입니다 것입니다 주어진 projectType을 얻는다. 'Job Totals'는 실제로 다른 레코드의 합계입니다. 위의 예에서 time1부터 time3까지의 합계입니다. ThreadMetrics 테이블 끝에있는 linkId는 다시 RegrCaseResult.id에 연결할 수 있습니다.

또한 특정 기간 동안 일관된 반환 코드가있는 프로젝트 만 포함하는 조건을 적용 할 수있는 방법이 있어야한다고 명시되어 있습니다. 내 최초의 질문이 오는 곳이다에서 다음과 같이

id projectName returnCode 

1 'first' 16 
2 'second' 16 
3 'third' 8 
4 'first' 16 
5 'second' 8 
6 'first' 16 

는 기본적으로 나는 더 일관성있는 반환 코드가 모든 프로젝트를 얻으려면 : 내가 달성하기 위해 노력하고 무엇을 보여주기 위해 다음과 같은 간단한 테이블을 생성

returnCode 값이 무엇인지. 위의 샘플에서 "첫 번째"프로젝트 하나만 가져와야합니다. 나는 이것이 간단 할 것이라고 생각하지만 데이터베이스에 관해서는 나쁘다. 어떤 도움이라도 좋을 것입니다.

나는 그것을 명확하게하기 위해 최선을 다했다. 희망은 내 목표를 달성했습니다.

Select Distinct ProjectName 
From Table A 
Where Not Exists 
(
    Select 1 
    From Table B 
    Where B.ProjectName = A.ProjectName 
    And  B.ReturnCode <> A.ReturnCode 
) 

당신이 선택하고 정확하게 확실하지 않다, 그래서 당신은 당신이 필요로 Select 문을 변경할 수 있습니다

+0

보유하고있는 기록은 몇 개입니까? – tadman

+1

10의 가장 가까운 힘에 대한 숫자가 내가 원하는 대답이었습니다. 십니까? 수천? 수백 수 백배? – tadman

+0

'third'또한 현재 정의에 따라 일치합니다. – Strawberry

답변

5

여기에 쉬운 방법입니다.

편집 :

'third' 아웃을 유지하기 위해, 당신은 하나 개 이상의 반환 코드를 가진 것으로, 다른 규칙이 필요합니다. 따라서 다음 작업을 수행 할 수 있습니다.

select projectname 
from table t 
group by projectname 
having min(returncode) = max(returncode) and count(*) > 1; 
+0

"third"가 결과에 포함되어야하는지 여부는 확실하지 않지만 좋은 생각입니다! – Strawberry

+2

그럼 ... 나는 갑자기 바보가된다. 나는 그것이 정말로 간단하다고 생각합니다. +1 – Siyual

+0

세 번째도 포함해야합니다. – dragon66

0

당신은 Not Exists과 같은 것을 시도 할 수 있습니다.

+0

값 비싼 연산이없고 연산 수가 많으면 실행 가능한 쿼리가 아닐 수도 있습니다. –

1
select projectName from projects 
    group by projectName having count(distinct(returnCode)) = 1) 

이렇게하면 하나의 항목 만있는 프로젝트도 반환됩니다.
어떻게 처리할까요?

예를를 작업하기 : http://www.sqlfiddle.com/#!2/e7338/8

+0

다른 질문을하고 있습니까? – cppcoder

+0

질문을 업데이트하십시오. 그 대답을 기반으로 내 대답을 업데이트 할 수 있습니다. 테이블에 CPU 사용량이 표시되지 않습니다. – cppcoder

+0

답변 해 주셔서 감사합니다. 그것은 역시 작동하지만 나는 오직 하나만 받아 들일 수 있습니다. 어쨌든 +1하십시오. – dragon66

0

이 그것을 수행해야합니다 이름으로

SELECT COUNT(ProjectName) AS numCount, ProjectName FROM (
    SELECT ProjectName FROM Foo 
    GROUP BY ProjectName, ReturnCode 
) AS Inside 
GROUP BY Inside.ProjectName 
HAVING numCount = 1 

이 그룹의 모든 ProjectNames 및 반환 코드, 만 나열 하나의 리턴 코드가 그 사람을 선택합니다.min()max() 값이 동일 (당신이 NULL 값을하지 않는 한) 모든 값이 같은 경우

select projectname 
from table t 
group by projectname 
having min(returncode) = max(returncode); 

:

SQLFiddle 링크 : http://sqlfiddle.com/#!2/c52b6/11/0

관련 문제