2016-07-28 39 views
0

我還沒有在大學完成相關課程,所以我不能確定這個查詢是否正確,但它的工作原理,但它看起來太奇怪,所以我需要審查和一些反饋。需要幫助才能在DB2中做出正確的選擇查詢

我有以下IP_TABLE表混合主鍵:ID + IP

---------------------------------- 
| ID | DATE  | IP   | 
---------------------------------- 
| 1 | 2016-10-01| 1.2.3.10 | 
---------------------------------- 
| 2 | 2016-10-20| 1.2.3.20 | 
---------------------------------- 
| 2 | 2016-10-25| 1.2.3.40 | 
---------------------------------- 
| 3 | 2016-10-01| 1.2.3.10 | 
---------------------------------- 
| 3 | 2016-10-25| 1.2.3.25 | 
---------------------------------- 

我想其中的數據具有相同的ID中的最大值都行,就像下面:

---------------------------------- 
| ID | DATE  | IP   | 
---------------------------------- 
| 1 | 2016-10-01| 1.2.3.10 | 
---------------------------------- 
| 2 | 2016-10-25| 1.2.3.40 | 
---------------------------------- 
| 3 | 2016-10-25| 1.2.3.25 | 
---------------------------------- 

現在我有兩個查詢是做這項工作的:

SELECT * FROM (SELECT ID, MAX(DATE) AS LAST_DATE 
        FROM IP_TABLE 
       GROUP BY ID 
        ORDER BY MAX(DATE) ASC) AS T1 
      LEFT JOIN IP_TABLE AS T2 
       ON T1.ID = T2.ID 
        AND T1.LAST_DATE = T2.DATE 

看起來很奇怪,我將自己的表連接起來,不知道它是否正確。

第二個工作查詢如下:

SELECT * FROM IP_TABLE AS T1 
    WHERE DATE = (SELECT MAX(DATE) FROM IP_TABLE WHERE ID = T1.ID) 

這恐怕這個查詢會導致性能的影響,因爲它看起來像爲O(n^2),即對每一行,它看起來在所有行。

回答

1

您可以使用窗口函數像ROW_NUMBER

SELECT ID, DATE, IP 
FROM (
    SELECT ID, DATE, IP, 
      ROW_NUMBER() OVER (PARTITION BY ID 
          ORDER BY DATE DESC) AS rn  
    FROM IP_TABLE) AS t 
WHERE t.rn = 1 

ROW_NUMBER列舉每個ID切片中的記錄,從具有最新DATE值(由於ORDER BY DATE DESC子句)的記錄。因此,外部查詢選擇最新的每ID記錄。

+0

謝謝它的工作原理,但請你提供一些解釋它是如何工作的? – Anatoly

+0

@Anatoly請檢查我所做的修改。 –