SQL Server:max和IN子句的问题

时间:2011-06-01 20:25:01

标签: sql-server

我在SQL Server 2008中有这个表:

create table [hFUNDASSET] 
(
    [hFundAssetID] numeric(19,0) identity not null, 
    [fundAssetID] numeric(19,0) not null, 
    [modified] datetime not null, 
    primary key ([hFundAssetID])
);

它是一个历史记录表,目标是根据给定的最大hFundAssetID列时间戳,为每个不同的modified获取最接近的fundAssetID

以下查询为每个modified获取正确的最新fundAssetID

select max(modified), fundAssetID 
    from hFundAsset 
 where fundAssetID IN 
    (
        select distinct (fundAssetID) 
            from hFundAsset where modified < 'April 20, 2010 11:13:00'
    )
group by fundAssetID;

我不能将hFundAssetID放在select子句中,而不是group by,这将返回额外的行。不知何故,我需要hFundAssetID匹配上述查询中返回的每个modified, fundAssetID对,或等价物。但是根据他们的文档,SQL Server不允许IN子句有多个值:

“子查询 - 是一个具有一列结果集的子查询。            此列必须与test_expression具有相同的数据类型。“

谷歌搜索显示'存在'和连接通常在这些情况下与mssql一起使用,但我尝试使用'max'和'group by'并且我在使用它时遇到问题。任何帮助赞赏。

1 个答案:

答案 0 :(得分:5)

试试这个:

WITH qry AS
(
    SELECT a.*,
            RANK() OVER(PARTITION BY fundAssetID ORDER BY modified DESC) rnk
        FROM hFundAsset a
     WHERE modified < 'April 20, 2010 11:13:00' 
)   
SELECT *
  FROM qry
WHERE rnk = 1