Sql 仅返回最新的行
我有一个名为TRANSFER的存储事务的表。我需要编写一个查询,只返回给定股票标签的最新交易记录(这是标识物料的唯一键),因此我使用了以下查询Sql 仅返回最新的行,sql,oracle,oracle11g,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 INN
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
考虑在子查询中选择
MAX(TRANSFER\u ID)
,假设TRANSFER\u ID
是一个递增字段,这样以后的传输总是比以前的传输有更大的ID。为了避免可能出现的不按传输日期顺序插入行的情况,可能是出于性能原因,您可能想试试:
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
如果两次转移发生在同一日期,您希望如何确定哪一次是最新的?(如果
TRANSFER.TRANSFER\u ID
是一个递增字段,您可以在子查询中选择MAX(TRANSFER\u ID)
,然后加入该值。)@cdhowie您好,该解决方案有效,谢谢:)酷。添加它作为一个答案。如果您曾经遇到记录未插入到转账日期顺序中的情况,那么加入max transfer\u id和transfer\u id的逻辑将失败。我自己也不会依赖它,尽管这个解决方案奏效了。还有其他方法吗?根据你的模式我看不到。考虑将<代码>传输日期> /代码>作为一个DATE时间列。那么,在寻找最新订单时,您将拥有第二精度。这将是需要考虑的问题,谢谢。