2013-11-26 30 views
0

假設我有以下數據並且我想收集最新的日期信息,那麼使用max函數或任何其他函數編寫sql的最佳方法是什麼?僅供參考 - 我只具有對服務器的只讀訪問權限,無法創建臨時表或以前的任何內容。如何根據以下數據在oracle SQL上使用max函數?

謝謝。

    <table border="1"> 
      <tr> 
      <th>NAME</th> 
      <th>ID</th> 
       <th>CODE</th> 
      <th>DATE</th> 
      </tr> 
      <tr> 
      <td>A </td> 
      <td>Z1 </td> 
      <td>780.52 </td> 
      <td>11/14/11</td> 
      </tr> 
      <tr> 
      <td>A </td> 
      <td>Z1 </td> 
      <td>780.54 </td> 
      <td>10/31/11</td> 
      </tr> 
      <tr> 
      <td>A </td> 
      <td>Z1 </td> 
      <td>780.54 </td> 
      <td>10/24/11 </td> 
      </tr> 
      <tr> 
      <td>AB  </td> 
      <td>Z22 </td> 
      <td>327.23 </td> 
      <td>12/09/11</td> 
      </tr> 
      <tr> 
      <td>AB  </td> 
      <td>Z22 </td> 
      <td>327.23 </td> 
      <td>11/02/11</td> 
      </tr> 
      <tr> 
      <td>AB  </td> 
      <td>Z22 </td> 
      <td>327.23 </td> 
      <td>09/13/11</td> 
      </tr> 
      <tr> 
      <td>B </td> 
      <td>Z55 </td> 
      <td>327.23 </td> 
      <td>01/06/11</td> 
      </tr> 
      <tr> 
      <td>C </td> 
      <td>Z77 </td> 
      <td>327.23 </td> 
      <td>01/04/11</td> 
      </tr> 
      <tr> 
      <td>DD </td> 
      <td>Z888 </td> 
      <td>327.23 </td> 
      <td>10/31/11</td> 
      </tr> 
      <tr> 
      <td>DD </td> 
      <td>Z888 </td> 
      <td>327.23 </td> 
      <td>10/24/11</td> 
      </tr> 
      <tr> 
      <td>DD </td> 
      <td>Z888 </td> 
      <td>327.23 </td> 
      <td>10/06/11</td> 
      </tr> 
      <tr> 
      <td>DD </td> 
      <td>Z888 </td> 
      <td>327.23 </td> 
      <td>08/08/11</td> 
      </tr> 
      <tr> 
      <td>DD </td> 
      <td>Z888 </td> 
      <td>780.54 </td> 
      <td>07/28/11</td> 
      </tr> 
      <tr> 
      <td>DD </td> 
      <td>Z888 </td> 
      <td>327.23 </td> 
      <td>07/19/11</td> 
      </tr> 
      <tr> 
      <td>EE </td> 
      <td>Z2323 </td> 
      <td>327.23 </td> 
      <td>03/17/11</td> 
      </tr> 
      <tr> 
      <td>EE </td> 
      <td>Z2323 </td> 
      <td>327.23 </td> 
      <td>02/24/11</td> 
      </tr> 
      <tr> 
      <td>EE </td> 
      <td>Z2323 </td> 
      <td>780.54 </td> 
      <td>02/13/11</td> 
      </tr> 
      <tr> 
      <td>FF </td> 
      <td>Z99 </td> 
      <td>327.23 </td> 
      <td>07/07/11</td> 
      </tr> 
      <tr> 
      <td>FF </td> 
      <td>Z99 </td> 
      <td>780.54 </td> 
      <td>06/28/11</td> 
      </tr> 
     <tr> 
      <td>II </td> 
      <td>Z963 </td> 
      <td>327.23 </td> 
      <td>09/19/11</td> 
      </tr> 
      <tr> 
      <td>II </td> 
      <td>Z963 </td> 
      <td>327.23 </td> 
      <td>08/30/11</td> 
      </tr> 
      <tr> 
      <td>II </td> 
      <td>Z963 </td> 
      <td>327.23 </td> 
      <td>06/29/11</td> 
      </tr> 
      <tr> 
      <td>II </td> 
      <td>Z963 </td> 
      <td>780.54 </td> 
      <td>06/29/11</td> 
      </tr> 
      <tr> 
      <td>II </td> 
      <td>Z963 </td> 
      <td>780.54 </td> 
      <td>06/14/11</td> 
      </tr> 
     <tr> 
     <td>L </td> 
     <td>Z99999 </td> 
     <td>327.23 </td> 
     <td>09/16/11</td> 
     </tr> 
     <tr> 
      <td>NN </td> 
     <td>Z9870 </td> 
     <td>327.23 </td> 
     <td>11/23/11</td> 
     </tr> 
     <tr> 
     <td>NN </td> 
     <td>Z9870 </td> 
     <td>327.23 </td> 
     <td>10/06/11</td> 
     </tr> 
     <tr> 
     <td>NN </td> 
     <td>Z9870 </td> 
     <td>327.23 </td> 
     <td>06/07/11</td> 
     </tr> 
     <tr> 
     <td>NN </td> 
     <td>Z9870 </td> 
     <td>780.54 </td> 
     <td>01/18/11</td> 
     </tr> 
     <tr> 
     <td>NN </td> 
     <td>Z9870 </td> 
     <td>780.54 </td> 
     <td>01/11/11</td> 
     </tr> 
     </table>    
+1

最近每個?名稱? ID總體? Top 1?前10名?你是否也需要代碼或只是數據?請爲上述數據添加預期的輸出。 –

+0

@OGHaza嗯,是的,我明白了。我不希望看到的是任何預期的產出。我假設'SELECT TOP 1 date FROM table'不是正確的答案。 –

+0

最近的整體或最近的每個代碼/名稱/ ID? – Mike

回答

0
SELECT tbl.Name, tbl.Id, tbl.Code, tbl.date 
FROM tbl 
    JOIN (
     SELECT Name, Id, Code, MAX(date) AS Max_Date 
     FROM tbl 
     GROUP BY Name, Id, Code) tbl_max 
    ON tbl.Name=tbl_max.Namne 
     AND tbl.Id=tbl_max.Id 
     And tbl.Code=tbl_Max.Code 
     AND tbl.Date=tbl_max.Max_Date 
+0

其實我想要每個名稱,ID和代碼的最新記錄。 – user3037020

+0

我已經編輯了答案,通過名稱,ID和代碼而不是僅僅是Id來給出最近的記錄。 –

+0

非常感謝您的先生! – user3037020

1

我想你可以嘗試任何這些應該幫助:

  1. select * from (Select * from your_table order by date desc) where rownum=1;

  2. select * FROM your_table WHERE date= (SELECT MAX(date) from your_table)

  3. SELECT * FROM (select a.*, MAX(date) OVER() max_date_column FROM your_table a) WHERE your_date_column = max_date_column

  4. SELECT * FROM(select a.*, ROW_NUMBER OVER(ORDER BY date DESC) rn FROM your_table a) WHERE rn = 1

+0

如果你有Id作爲主鍵,那麼你可以嘗試,select * from tablename where id in(Select select from tablename order by date desc)and rownum = 1; – Gayathri

1

SQL Fiddle

查詢1

SELECT MIN(NAME) KEEP (DENSE_RANK LAST ORDER BY "DATE" ASC) AS NAME, 
     MIN(ID ) KEEP (DENSE_RANK LAST ORDER BY "DATE" ASC) AS ID, 
     MIN(CODE) KEEP (DENSE_RANK LAST ORDER BY "DATE" ASC) AS CODE, 
     MIN("DATE") KEEP (DENSE_RANK LAST ORDER BY "DATE" ASC) AS "DATE" 
FROM tbl 

Results

| NAME | ID | CODE |       DATE | 
|------|------|--------|---------------------------------| 
| AB | Z22 | 327.23 | December, 09 2011 00:00:00+0000 |