2014-03-27 46 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) 

,我想找到的ID隨着時間的推移不斷增加Test_Value。在這個例子中,只有SubjectID 3滿足該條件。你可以編寫代碼來找出這個問題嗎?感謝您一如既往的幫助。

+1

在擔心「最高效」之前,請擔心「給出正確答案」。 –

+2

在MySQL之外執行此操作可能會更好。無論你使用什麼語言。 –

+0

在我正在處理的數據集中,大約有5000萬行和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

我測試了它,不工作=(也許移動內部查詢到左連接? – 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'將爲空) – zerkms

+0

@zerkms ...我保留思考......「NULL」是好的。它會跳過它並移動到下一個值。它不會影響總和()。「但它當然如你所指出的那樣。 –