2011-06-01 47 views
2

問題,我有這個表中的SQL Server 2008:的SQL Server:用最大,並在第

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

它的歷史表,我們的目標是讓基於給定的最大modified列時間戳最接近hFundAssetID,爲每個不同的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子句的值:

「subquery - 是一個子查詢,其結果集爲一列 該列必須與test_expression具有相同的數據類型。 「

谷歌搜索顯示'存在'和連接通常在這些情況下與mssql一起使用,但我已經嘗試使用'max'和'group by',並且遇到問題使其工作。任何幫助讚賞。

回答

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 
+0

尼斯使用RANK的()。 2005年補充說,我非常高興。 – RThomas 2011-06-01 20:35:36

+1

值得一提的是,如果您的數據恰好有多行,並且修改日期和fundAssetID完全相同,那麼您的結果中可能會出現多行,並且使用相同的fundAssestID但不同的hFundAssestID。如果不需要,可以使用ROW_NUMBER()。雖然答案很好。 – TKTS 2011-06-01 21:08:21

+0

完美的工作。非常感謝您的快速和有益的迴應!我需要一些時間來理解它,但我確實學到了很多:-)。編輯:我會在我們的測試期間看看ROW_NUMBER建議,謝謝。 – iksrazal 2011-06-01 21:23:12