1

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
4

2 に答える 2

1

後の転送が常に前の転送よりも大きいIDを持つように、それが増分フィールドであるとMAX(TRANSFER_ID)想定して、サブクエリで選択することを検討してください。TRANSFER_ID

于 2012-11-27T07:04:29.003 に答える
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
于 2012-11-27T07:33:19.873 に答える