2017-10-21 70 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 | 
+----+------------------------+-----------+ 

什麼是選擇最新的檢測最有效的方法是什麼?查詢需要包括IDCONDITION列,儘管他們不會group by乾淨:

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

回答

1

的一種方法是檢索id和派生表date列和輸出連接到主表從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支持windows功能,使用下面。

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