2017-10-21 9 views
0

私はROAD_INSPECTIONテーブルを持っている:を選択し、最新の検査

+----+------------------------+-----------+ 
| ID |   DATE   | CONDITION | 
+----+------------------------+-----------+ 
| 1 | 01/01/2009    |  20 | 
| 1 | 05/01/2013    |  16 | 
| 1 | 04/29/2016 10:02:52 AM |  15 | 
+----+------------------------+-----------+ 
| 2 | 01/01/2009    |   8 | 
| 2 | 06/06/2012 9:55:13 AM |   8 | 
| 2 | 04/28/2015    |  11 | 
+----+------------------------+-----------+ 
| 3 | 06/11/2012    |  10 | 
| 3 | 04/21/2015    |  19 | 
+----+------------------------+-----------+ 

最新の検査を選択するための最も効率的な方法は何ですか?

+----+------------------------+-----------+ 
| ID |   DATE   | CONDITION | 
+----+------------------------+-----------+ 
| 1 | 04/29/2016 10:02:52 AM |  15 | 
+----+------------------------+-----------+ 
| 2 | 04/28/2015    |  11 | 
+----+------------------------+-----------+ 
| 3 | 04/21/2015    |  19 | 
+----+------------------------+-----------+ 

答えて

1

一つの方法派生テーブルでiddate列を取得して、メインの出力に参加することができますクエリは、彼らきれいになりませんgroup byがあるという事実にもかかわらず、IDCONDITION列を含める必要があるだろう以下のように対応するデータをcondition列から検索します。

SELECT t1.id, 
     t1.date1, 
     t2.CONDITION1 
FROM 
    (SELECT id, 
      max(date1) AS date1 
    FROM table1 
    GROUP BY id) t1 
JOIN table1 t2 ON t1.id = t2.id 
AND t1.date1 = t2.date1; 

結果:

id date1     CONDITION1 
------------------------------------- 
1 29.04.2016 10:02:52 15 
2 28.04.2015 00:00:00 11 
3 21.04.2015 00:00:00 19 

DEMO

たり、rdbmsは以下の使用、窓の機能をサポートしている場合。

SELECT id, 
     date1, 
     condition1 
FROM 
    (SELECT id, 
      date1, 
      condition1, 
      row_number() over(PARTITION BY id 
          ORDER BY date1 DESC) AS rn 
    FROM table1) t1 
WHERE rn = 1; 

DEMO

関連する問題