2014-05-06 43 views
0

我有一個MS SQL Server express 2012表,它不斷地填充數據讓我們知道我們的哪些產品可用。每種產品下都有一個或多個子產品。當更新產品的過程進行更新時,它也會同時更新所有的子產品。 (因此所有的都將具有相同的找到日期標記,因爲它們是在同一運行中找到的)。由於此數據不斷添加到表中,因此只有最新的數據很重要。我們不希望刪除舊數據,因爲它用於其他目的,但我需要幫助創建聲明以幫助我查看每個產品(包括子產品)的最新數據。挑戰在於我們擁有數千種產品和子產品他們都會有不同的「最新發現」時代。需要幫助創建對最新數據的SQL查詢

這個SQL小提琴是什麼我的數據看起來像一個非常簡化的版本:http://sqlfiddle.com/#!3/0531b/1

我想幫助創建爲每個產品只返回最近的founddate(以及相應的數據)的查詢。我想這個查詢的結果(使用小提琴中的數據集)看起來像這樣:

product sub_product founddate 
1  1   5/3/2014 
1  2   5/3/2014 
2  7   5/4/2014 
2  8   5/4/2014 
2  9   5/4/2014 
3  10   4/15/2014 

任何幫助是非常讚賞。

+0

+1。 。 。用SQL小提琴編寫的精心編寫的問題,無需評論。我不明白。 –

回答

1

可能是最有效的方式做,這是一個not exists條款:

select * 
from project_data pd 
where not exists (select 1 
        from project_data pd2 
        where pd2.product = pd.product and 
         pd2.founddate > pd.founddate 
       ); 

的邏輯是:「給我從project_data的所有行相同的產品不具有較大的日期。」這將在project_data(product, founddate)的指數上表現最佳。

+0

謝謝,這對我來說非常完美! – Ryan

0

下面是使用Max另一種選擇加入表本身:

select pd.product, pd.sub_product, pd.founddate 
from project_data pd 
    join (select product, max(founddate) maxdt 
     from project_data 
     group by product 
     ) t on pd.product = t.product and pd.founddate = t.maxdt 
0

試試這個:

SELECT T2.product,T1.sub_product,T2.founddate 
FROM project_data T1 INNER JOIN 
(
    select product,CONVERT(VARCHAR(10), CONVERT(datetime, max(founddate), 1), 101)as founddate 
    from project_data 
    GROUP BY product 
) T2 ON T1.founddate=T2.founddate AND T1.product=T2.product 
ORDER BY T2.product,T1.sub_product 

結果:

PRODUCT SUB_PRODUCT FOUNDDATE 
1   1    05/03/2014 
1   2    05/03/2014 
2   7    05/04/2014 
2   8    05/04/2014 
2   9    05/04/2014 
3   10   04/15/2014 

查看結果在SQL Fiddle

說明:

內部查詢選擇product和最大founddate每個產品。然後該表本身已經與productfounddate上的結果集合在一起,用於在內部查詢的結果中爲每個productfounddate選擇sub_product