2014-03-27 2 views
3

나는 다음과 같은 테이블이 있습니다MySQL은 : constatnly 증가 값으로 ID를 찾을 수

create table my_table 
(
SubjectID int, 
Date Date, 
Test_Value int 
); 

insert into my_table(SubjectID, Date, Test_Value) 
values 
(1, '2014-01-01', 55), 
(1, '2014-01-05', 170), 
(1, '2014-01-30', 160), 
(2, '2014-01-02', 175), 
(2, '2014-01-20', 166), 
(2, '2014-01-21', 160), 
(3, '2014-01-05', 70), 
(3, '2014-01-07', 75), 
(3, '2014-01-11', 180) 

내가 지속적으로 시간이 지남에 Test_Value 증가와 함께 ID를 찾으려합니다. 이 예에서는 SubjectID 3만이 해당 조건을 충족시킵니다. 이것을 찾으려면 코드를 작성해 주시겠습니까? 언제나처럼 당신의 도움에 감사드립니다.

+1

"가장 효율적인"것에 대해 걱정하기 전에 "정답을주십시오"라고 걱정하지 마십시오. –

+2

MySQL 외부에서 이것을하는 것이 더 나을 수도 있습니다. 당신이 사용하는 언어에 상관없이. –

+0

내가 작업중인 데이터 세트에는 약 5,000 만 개의 행과 1100 만 개의 ID가 있습니다. 이것이 MySQL에서 할 수 있다면 더 좋을 것입니다. – midtownguru

답변

4
SELECT * 
FROM my_table o 
WHERE NOT EXISTS (
    SELECT null 
    FROM my_table t1 
    INNER JOIN my_table t2 ON t2.Date > t1.Date AND t2.Test_Value < t1.Test_Value AND t1.SubjectID = t2.SubjectID 
    WHERE t1.SubjectID = o.SubjectID 
) 

내부 쿼리는 DO가 요구 사항을 위반하는 모든 개체를 선택합니다 : 그들은 최소 값을 나중에 날짜가 있습니다. 그런 다음 내부 쿼리의 항목과 일치하지 않는 외부 선택 엔터티.

SQLFiddle : http://www.sqlfiddle.com/#!2/1a7ba/12

PS : 한 ID를 필요로하는 경우 아마도 - 값이 단조롭게 증가하지 않는 경우, 인접한 값이 감소 적어도 하나의 경우가, SELECT DISTINCT SubjectID

+0

나는 그것을 테스트했지만 작동하지 않는다 = (내부 쿼리를 LEFT JOIN으로 옮길 수 있습니까? – Peter

+0

@Peter : 다시 시도하십시오 http://www.sqlfiddle.com/#!2/1a7ba/12 (ID 일치 조건 누락) – zerkms

+0

니스, 당신은'AND t1.SubjectID = t2.SubjectID'를 추가했고 지금은 작동합니다. 내 대답을 제거했는데 당신의 것이 훨씬 낫습니다. – Peter

0

를 사용한다. 따라서이 문제를 줄이면 이전 값을 볼 수 있습니다.

select t.SubjectId 
from (select t.*, 
      (select TestValue 
       from table t2 
       where t2.SubjectId = t.SubjectId and 
        t2.Date < t.Date 
       order by t2.Date desc 
       limit 1 
      ) as prev_Test_value 
     from table t 
    ) t 
group by t.SubjectId 
having coalesce(sum(Test_Value < prev_Test_value), 0) = 0; 
+0

특정 SubjectId에 대한 항목이 하나만있는 경우 -이 쿼리는 반환하지 않습니다 ('prev_Test_value'는 null이 될 것이기 때문에) – zerkms

+0

@zerkms .... 생각하다 .... ""NULL "은 괜찮아. 건너 뛰고 다음 값으로 이동합니다. 그것은 sum()에 영향을 미치지 않습니다. "그러나 물론 당신이 지적한대로합니다. –

관련 문제