【问题标题】:To return only the latest row [duplicate]仅返回最新行[重复]
【发布时间】:2012-11-27 06:54:48
【问题描述】:

我有一个名为 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

【问题讨论】:

  • 如果两个转账发生在同一天,您希望如何确定哪一个是最新的? (如果TRANSFER.TRANSFER_ID 是一个递增字段,您可以在子查询中选择MAX(TRANSFER_ID),然后加入该值。)
  • @cdhowie 嗨,该解决方案有效,谢谢 :)
  • 酷。添加它作为答案。
  • 如果您曾经遇到过没有按 transfer_date 顺序插入记录的情况,那么这种加入 max transfer_id 和 transfer_id 的逻辑将失败。我自己不会依赖它。

标签: sql oracle oracle11g


【解决方案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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 虽然该解决方案有效。还有其他方法吗?
    • 不是从我所看到的给定您的架构。考虑将TRANSFER_DATE 调整为日期时间列。那么您在查找最新订单时将具有第二精度。
    • 那将是值得考虑的事情,谢谢。
    猜你喜欢
    • 2016-03-13
    • 2013-11-01
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多