使用带加入的SQL子查询时获取MAX Date

时间:2013-07-29 12:47:58

标签: sql date join subquery max

我有两个表Deal和SCHNAV,带有一个公共字段'security'。交易包含迄今为止购买和出售的所有证券的详细信息,并且schnav包含每个日期的关闭证券持有。我想要一个sql来获取在特定日期持有的证券中完成的所有交易的最新(最大)日期,直到交易表的那个日期。

我使用以下查询来获取所有交易,然后从pivot获得最新值。但我需要一个SQL,所以我不必在Excel中进行操作。

select scheme, security, asset_type, tran_type 
from deal 
where security in (select security from schnav where nav_date = '31 Mar 2013') 
  and d.value_date < '01 Apr 2013';

请帮忙。并提前致谢

1 个答案:

答案 0 :(得分:1)

您需要将dealsecurity表连接在一起。除了security字段上的条件之外,您还有日期条件。

最后,您需要在日期或之前找到最后一笔交易。为此,大多数数据库都支持row_number()函数。

以下查询将这些组合在一起:

select scheme, security, asset_type, tran_type
from (select d.scheme, d.security, d.asset_type, d.tran_type,
             row_number() over (partition by d.security order by d.value_date desc) as seqnum 
      from deal d join
           schnav s
           on d.security = s.security and
              d.value_date <= s.nav_date and
              s.nav_date = '31 Mar 2013'
    ) d
where seqnum = 1;

编辑:

要只获得一个tran_type,请在子查询中使用where子句:

select scheme, security, asset_type, tran_type
from (select d.scheme, d.security, d.asset_type, d.tran_type,
             row_number() over (partition by d.security order by d.value_date desc) as seqnum 
      from deal d join
           schnav s
           on d.security = s.security and
              d.value_date <= s.nav_date and
              s.nav_date = '31 Mar 2013'
     where d.tran_type = 'P'
    ) d
where seqnum = 1;