如何根据以下数据在oracle SQL上使用max函数?

时间:2013-11-26 15:30:25

标签: sql oracle

假设我有以下数据并且我想收集最新的日期信息,那么使用max函数或任何其他函数编写sql的最佳方法是什么?仅供参考 - 我只有对服务器的只读访问权限,无法创建临时表或其他任何内容。

感谢。

                 <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>               

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 |

答案 2 :(得分: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