仅返回最新一行

时间:2012-11-27 06:54:48

标签: sql oracle oracle11g

我有一个存储名为TRANSFER的事务的表。我需要编写一个查询来仅返回给定股票代码的最新交易条目(这是识别材料的唯一键)所以我使用了以下查询

SELECT a.TRANSFER_ID
     , a.TRANSFER_DATE
     , a.ASSET_CATEGORY_ID
     , a.ASSET_ID
     , a.TRANSFER_FROM_ID
     , a.TRANSFER_TO_ID
     , a.STOCK_TAG
 FROM TRANSFER a
INNER JOIN (
              SELECT STOCK_TAG
                   , MAX(TRANSFER_DATE) maxDATE
                FROM TRANSFER
               GROUP BY STOCK_TAG
            ) b
   ON a.STOCK_TAG = b.STOCK_TAG AND
      a.Transfer_Date =b.maxDATE

但我最终遇到的问题是,当同一转移日期发生多次转移时,它会返回所有行,而我只需要最新的行。我怎么能得到最新的一行?

编辑:

transfer_id   transfer_date   asset_category_id  asset_id   stock_tag 
 1               24/12/2010      100               111         2000
 2               24/12/2011      100               111         2000

2 个答案:

答案 0 :(得分:1)

考虑在子查询中选择MAX(TRANSFER_ID),假设TRANSFER_ID是一个递增字段,以便以后的传输总是具有比早期传输更大的ID。

答案 1 :(得分:1)

为避免未按transfer_date顺序插入行的潜在情况,并且可能出于性能原因,您可能想尝试:

 select
   TRANSFER_ID      ,
   TRANSFER_DATE    ,
   ASSET_CATEGORY_ID,
   ASSET_ID         ,
   TRANSFER_FROM_ID ,
   TRANSFER_TO_ID   ,
   STOCK_TAG
 from (
   SELECT
     TRANSFER_ID      ,
     TRANSFER_DATE    ,
     ASSET_CATEGORY_ID,
     ASSET_ID         ,
     TRANSFER_FROM_ID ,
     TRANSFER_TO_ID   ,
     STOCK_TAG        ,
     row_number() over (
       partition by stock_tag
       order by     transfer_date desc,
                    transfer_id desc) rn
   FROM TRANSFER)
 where rn = 1