2017-03-28 55 views
0

我有這些記錄:排序/查找日期

PHOT 1/16/2017 20170118 0.01 
PHOT 1/16/2017 20170117 0.0103 
PHOT 1/16/2017 20170116 0.0101 
PHOT 1/16/2017 20170115 0.0101 
PHOT 1/16/2017 20170114 0.0105 
. 
. 
. 
MSRT 12/31/2016 20170327 0.855 
MSRT 12/31/2016 20170324 0.87 
MSRT 12/31/2016 20170323 0.87 
MSRT 12/31/2016 20170322 0.88 
MSRT 12/31/2016 20170321 0.89 
. 
. 
. 

基本上我需要在第3列是< =列日2

應該由被分割的最接近的日期記錄第1列我只需要1條記錄,即具有閉合的第2列日期到第1列日期的記錄。

這可以用一些DENSE_RANK嗎?或者我應該使用ROW_NUMBER?

+0

哪些列2和3的數據類型? – GurV

+0

如果(column1,column3)沒有重複項,則DENSE_RANK和ROW_NUMBER將產生相同的結果。如果有重複,則說明問題沒有完全指定:如果對於column1中的同一個字符串,在第3列中有兩個或更多行綁定爲「最近日期」,應該選擇哪一行? (或所有這些?)這是DENSE_RANK或ROW_NUMBER將是正確的選擇;這是正確的選擇取決於您的業務需求。 – mathguy

回答

0

下面的查詢應該有所幫助:

Select * from (
select row_number() over (partition by t.col1 order by  
abs(t.col2-to_date(t.col3, 'yyyymmdd'))) rw, t.* 
From tbl t where t.col2 >= to_date(t.col3, 'yyyymmdd')) where rw = 1; 

說明:

內部查詢使用to_date函數的COL3爲格式的日期一樣COL2相同的模式。

然後我們可以在where子句中將它與col2進行比較。接下來,我們對每個col1(col1分區,按abs排序)排列這兩列之間的絕對空間(同樣用to_date)。

最後,我們對每個col1組(rw = 1)取最上一行。

請注意,如果您使用的是dense_ranke,它可以爲每個col1創建多行,因爲如果您有兩行具有相同的絕對值 - dense_ranke會將它們排序爲相同的數字(比如說-1),然後您可以爲每列獲得幾行。 Row_number總是會爲每一行提供唯一的排名。

+0

太棒了!有用。謝謝!!!! –

+0

雖然這個代碼片斷可以解決的問題,[包括解釋(http://meta.stackexchange.com/questions/114762/explaining-entirely-代碼爲基礎的答案)確實有助於提高質量您的帖子。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。 –

+0

爲真。現在解釋存在。謝謝。 – user2671057