2014-12-01 11 views
0

내가 그렇게 t.trial에 응축,MySQL의 비례 부분 집합

t.trial | count(*) | MAX(d.value) 
--------------------------------- 
1  | 80  | 176 
2  | 63  | 219 
3  | 49  | 109 
4  | 67  | 155 

하나는 d의 행이 두 번째를 나타냅니다 반환 그래서

SELECT 
    t.trial, 
    count(*), 
    MAX(d.value) 
FROM data d 
INNER JOIN trial_info t 
    ON d.instance_timestamp BETWEEN t.trial_start_timestamp AND t.trial_end_timestamp 
GROUP BY t.trial; 

같은 쿼리를 가지고는 count(*)이 수를 반환된다는 것을 의미합니다 각 시도에서 초 단위로 표시되며, MAX(d.value)은 해당 초에서 관찰 된 최대 값입니다.

질문 : 어떻게 깍 만에 결과가 각 시험 그 시간의 MAX 값의 중간 50 %를 반환 할 수 있습니다? 나는 시험 시간의 처음 25 %와 마지막 25 %를 버리고 싶다. 내 하위 쿼리 기술이 너무 뜨겁지 않습니다 ...

여기까지 내 생각입니다. computedValue이 고정 숫자로 설정되면이 조인을 대체 할 수 있습니다. 그러나 computedValue을 반환 된 행의 백분율 (위의 결과 열 count(*)에 표시)로 지정합니다.

INNER JOIN trial_info t ON d.instance_timestamp BETWEEN 
    DATE_ADD(t.trial_start_timestamp, INTERVAL computedValue SECOND) AND 
    DATE_SUB(t.trial_end_timestamp, INTERVAL computedValue SECOND) 
+0

샘플 결과를 제공하십시오. 조회가 계수를 리턴합니다. 따라서 중간 50 %는 '0.5 * 카운트 (*)'입니다. –

+0

샘플 결과가 포함되었습니다. –

+0

데이터 샘플을 제공 할 수 있습니까? 여전히 의미가 없습니다. 't'에서 컬럼의 최대 값을 계산한다면, 이것은'data'와 어떤 관계가 있습니까? –

답변

0

사용 TIMESTAMPDIFFt.trial_end_timestampt.trial_start_timestamp에서 초에서 0.25 * 간격을 얻을 수 있으며 라운드 FLOOR를 사용하여 정수로 :

FLOOR(TIMESTAMPDIFF(SECOND,t.trial_start_timestamp,t.trial_end_timestamp)*0.25) 

그래서 조인 조건은 다음과 같습니다

INNER JOIN trial_info t ON d.instance_timestamp BETWEEN 
    DATE_ADD(t.trial_start_timestamp, INTERVAL FLOOR(TIMESTAMPDIFF(SECOND,t.trial_start_timestamp,t.trial_end_timestamp)*0.25) SECOND) AND 
    DATE_SUB(t.trial_end_timestamp, INTERVAL FLOOR(TIMESTAMPDIFF(SECOND,t.trial_start_timestamp,t.trial_end_timestamp)*0.25) SECOND) 

편집 :

d.instance_timestamp BETWEEN (SELECT d1.instance_timestamp FROM data d1 
where d1.instance_timestamp BETWEEN t.trial_start_timestamp AND t.trial_end_timestamp ORDER BY d1.instance_timestamp ASC LIMIT 1 OFFSET (SELECT FLOOR(0.25 * COUNT(*)) FROM data d2 where d2.instance_timestamp BETWEEN t.trial_start_timestamp AND t.trial_end_timestamp)) 
AND 
(SELECT d3.instance_timestamp FROM data d3 
where d3.instance_timestamp BETWEEN t.trial_start_timestamp AND t.trial_end_timestamp ORDER BY d3.instance_timestamp ASC LIMIT 1 OFFSET (SELECT FLOOR(0.75 * COUNT(*)) FROM data d4 where d4.instance_timestamp BETWEEN t.trial_start_timestamp AND t.trial_end_timestamp)) 

: 당신의 50 %가 임상 시험의 수를 기반으로하지 타임 스탬프 솔루션은 d.instance_timestamp 재판의 25 % ~ 75 %의 번호에서 경계를 얻을 LIMIT를 사용하고 하위 쿼리의 오프셋 (offset)하는 것 그러나, MySQL은 LIMIT와 OFFSET의 값으로 부질의를 지원하지 않는다. MySQL의에서이 작업을 수행하려면, 당신은 SUBSTRING_INDEXGROUP_CONCAT를 사용하여 25 및 75 백분위 수에서 instance_timestamp를 계산해야합니다

d.instance_timestamp BETWEEN 
    (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(d1.instance_timestamp ORDER BY d1.instance_timestamp SEPARATOR ','), ',' , 0.25 * COUNT(*) + 1), ',', -1) FROM data d1 
where d1.instance_timestamp BETWEEN t.trial_start_timestamp AND t.trial_end_timestamp) 
    AND 
    (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(d2.instance_timestamp ORDER BY d2.instance_timestamp SEPARATOR ','), ',' , 0.75 * COUNT(*) + 1), ',', -1) FROM data d2 
where d2.instance_timestamp BETWEEN t.trial_start_timestamp AND t.trial_end_timestamp) 
+1

@ user3477312 . . 그러나 문제에 대한 설명에 따르면 타임 스탬프에 대한 산술 연산이 작동해야합니다. –

+0

와우, 고마워. 너희들 말이 맞아. 나는 마침내 그것을 본다. 나는 이것을 과도하게 복잡하게 만들었다. 비록 내가 그 방법을 어떻게 설명하는지 궁금하지만 ... :) –

+0

@anhlc MySQL에서 오프셋을위한 서브 쿼리 ...? –