我有一个存储名为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
答案 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