我在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'并且我在使用它时遇到问题。任何帮助赞赏。
答案 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