2010-09-02 60 views
0

我有表: CREATE TABLE [DBO] [測試]( [名]爲nvarchar(最大)NULL, [日期]日期時間NULL )噸-SQL合計最大

和記錄:

a 2010-09-02 12:00:00 
a 2010-09-02 11:00:00 
b 2010-09-02 12:00:00 
b 2010-09-02 11:00:00 

,我想獲得與最新日期的所有名稱:

我可以這樣做:

select t.[name] from test t 
group by t.[name] 
having max(date) = (select MAX(DATE) from test where [name] = t.[name]) 

其中有一個問題 - 我不能得到一個日期

我可以這樣做:它也沒有任何問題

我的問題是

select t.* 
    from test t 
    where t.[date] = (select MAX(DATE) from test where [name] = t.[name]) 

: 可能我這樣做更好??我將從表增量表中獲取大約10,000條記錄(每天再增加10,000個結果)。

問候

回答

2

什麼版本的SQL Server?

SQL 2005和高達:

SELECT * 
FROM 
    (SELECT Item = Row_Number() OVER (PARTITION BY [name] ORDER BY [date] DESC), * FROM test) X 
WHERE Item = 1 

SQL 2000:

SELECT T.* 
FROM 
    test T 
    INNER JOIN (
     SELECT [name], MaxDt = Max([date]) FROM test GROUP BY [name] 
    ) X ON T.[name] = X.[name] AND T.[date] = X.MaxDt 

如果你能有重複的日期,則需要另一步的SQL 2000版本,以獲得它下降到一排。

@Oded指出,你可以簡單地得到最大日期。如果你所需要的只是名字和日期,那麼他的查詢是最好的。但如果我懷疑是正確的,你需要來自同一行的更多項目,那麼你需要這樣的查詢。

這裏的另一個SQL 2005的版本:

SELECT 
    T.* 
FROM 
    test T 
    CROSS APPLY (
     SELECT TOP 1 [date] 
     FROM test T2 
     WHERE T.[name] = T2.[name] 
     ORDER BY T2.[date] DESC 
    ) X 
WHERE 
    T.[date] = X.[date] 

此查詢將有重複的最大日期同名

更新

現在我知道它的問題是SQL 2008:

row_number()解決方案最簡單也最簡單。我會以此開始。如果性能是不夠的,桌子是具有各自[名]只有一次父表的子表,嘗試CROSS應用解決方案與外部表(測試T)作爲父:

SELECT 
    X.* 
FROM 
    Parent P 
    CROSS APPLY (
     SELECT TOP 1 * 
     FROM test T 
     WHERE P.[name] = T.[name] 
     ORDER BY T.[date] DESC 
    ) X 

如果沒有父表,你可以試試上面的查詢或使用SELECT DISTINCT [name] FROM test,但我不相信這將是一個性能改進:

SELECT 
    X.* 
FROM 
    (SELECT DISTINCT [name] FROM test) P 
    CROSS APPLY (
     SELECT TOP 1 * 
     FROM test T 
     WHERE P.[name] = T.[name] 
     ORDER BY T.[date] DESC 
    ) X 
+0

我使用了sql 2008,並且我想獲得其他列(不是onlu名稱和日期)。哪種解決方案最好? 單個名稱可能有相同的日期 – dzajdol 2010-09-02 08:12:55

+0

您只需嘗試一下,看看哪種效果最好。另外,我在我的更新中修正了一些錯別字,對此感到遺憾。 – ErikE 2010-09-02 08:24:32

+0

oki thx尋求答案 – dzajdol 2010-09-02 08:35:22

2

這將選擇不同的名稱和相關的每一個最新的日期:

select t.[name], MAX(t.[date]) 
from test t 
group by t.[name] 

使用GROUP BY,你也可以使用聚合函數的SELECT條款中對於不是一部分的列分組。

從MSDN(Aggregate Functions):

聚合函數經常與GROUP BY用在SELECT語句的WHERE子句。

+0

這正是我要發佈。簡單的解決方案。 – codingbadger 2010-09-02 08:05:01