2014-04-14 26 views
2

我有過去的記錄一個巨大的表格看起來類似於此的值從一個字段中的值:試圖選擇基於日期字段,其中第一個值不爲空

field1, field2, field3, startDate, lastUpdate 
-------------------------------------------------- 
1   A  B  NULL  3/1/2014 
1   A  B  1/5/2014 3/2/2014 
1   A  B  1/7/2014 3/3/2014 
1   A  B  1/2/2014 3/4/2014 
1   A  B  NULL  3/5/2014 
2   C  D  1/28/2014 3/1/2014 
2   C  D  1/17/2014 3/2/2014 
2   C  D  NULL  3/3/2014 
2   C  D  NULL  3/4/2014 
2   C  D  NULL  3/5/2014 

我試圖寫一個查詢,在那裏我可以將field1,field2和field3轉換爲一個不同的記錄,然後使startDate值基於最新的lastUpdate值,其中startDate is not NULL。所以我理想的輸出是這樣的:

field1, field2, field3, startDate 
-------------------------------------- 

1  A   B  1/2/2014 
2  C   D  1/17/2014 

我的SQL技能不是那麼強大,有什麼想法嗎?

回答

1
; WITH CTE 
AS 
(
    SELECT field1, field2, field3, startDate, lastUpdate, 
     ROW_NUMBER() OVER (PARTITION BY field1, field2, field3 
          ORDER BY lastUpdate DESC) AS RN 
    FROM Table_Name 
    WHERE startDate IS NOT NULL 
) 
SELECT field1, field2, field3, startDate, lastUpdate 
FROM CTE 
WHERE RN = 1 
+0

乾杯@Serpiton :) –

+0

我在寫同樣的查詢,刷新後我不要和拼寫檢查你的:) – Serpiton

+0

到OP:ROW_NUMBER()是一個SQLServer 2005或更好功能 – Serpiton

0

你可以做一個自聯接查找最大lastUpdated

select field1, field2, field3, startDate 
from table t1 
where startDate is not null 
    and not exists (select * from table t2 
        where t1.field1=t2.field1 
        and t1.field2=t2.field2 
        and t1.field3=t2.field3 
        and startDate is not null 
        and t1.lastUpdate<t2.lastUpdate) 

這將篩選有null的startDate所有行,併爲每個組,它會忽略所有具有與行的行相同的條件和更大的lastUpdate值。

工作sql fiddle

相關問題