2014-10-10 48 views
1

記錄我有以下格式的表:甲骨文語句來抓取基於約束

ID FieldA LastUpdatedDate 

1  1  7th Oct, 2014 
2  2  7th Oct, 2014 
3  3  7th Oct, 2014 
4  1  8th Oct, 2014 
5  2  8th Oct, 2014 
6  1  8th Oct, 2014 
7  2  9th Oct, 2014 
8  4  9th Oct, 2014 

我想成爲如下結果:

ID FieldA LastUpdatedDate 
4  1  8th Oct, 2014 
6  1  8th Oct, 2014 
2  2  9th Oct, 2014 
3  3  7th Oct, 2014 
8  4  9th Oct, 2014 

請注意只能是給定日期的FieldA中具有相同值的兩個條目,我希望 基於lastupdateddate檢索條目,如示例中所示。

您能否給我建議一個能給我這樣結​​果的查詢?

+1

你能解釋一下你用來產生這種結果的邏輯(英文,而不是在SQL,顯然:-)) – Mureinik 2014-10-10 11:24:08

+0

我會希望得到記錄根據表中最新的日期重複字段和非重複字段。另外,我還想根據上例中引用的FieldA對條目進行排序。如果您檢查此處引用的示例,FieldA中有3條值= 1的記錄。我想要獲取具有最新更新日期的記錄。在這裏,我會得到2個FieldA的值爲1的記錄,這兩個記錄的lastupdateddate都是2014年10月8日。 – RS389 2014-10-10 11:47:58

+0

除此之外,我還希望其他條目像FieldA的值爲2,3和4的記錄,因爲它們分別顯示它們的lastupdatedDate。請讓我知道這是否有助於理解我在找什麼。 – RS389 2014-10-10 11:48:25

回答

0

如果我理解正確,對於每個不同的值fieldA,您只想顯示最近的LastUpdatedDate中的記錄。該rank解析函數應該做的伎倆:

SELECT ID, FieldA, LastUpdatedDate 
FROM (SELECT ID, FieldA, LastUpdatedDate, 
       RANK() OVER (PARTITION BY ID, FieldA 
          ORDER BY LastUpdatedDate DESC) AS rk 
     FROM my_table) 
WHERE rk = 1 
+0

我試過這個,但沒有按預期工作。 – RS389 2014-10-13 06:25:55

+0

@ RS389我似乎錯過了'partition by'子句中的'ID'列。我編輯了我的答案來包含它 - 現在就試試。 – Mureinik 2014-10-13 07:50:31

+0

我嘗試過這樣 - 從my_table中選擇ID,FieldA,LastUpdatedDate,其中LastCONDatedDate(從my_table中選擇max(LastUpdatedDate))按FIELDA排序; – RS389 2014-10-13 09:58:22

0
with lastD as -- get the last update date for every FieldA 
(
select FieldA, max(LastUpdateDate) as lastDate 
from my_table 
group by FieldA 
) 
SELECT m.* 
FROM my_table m 
JOIN lastD 
    ON m.FieldA=lastD.FieldA 
AND m.LastUpdateDate= lastD.lastDate 
+0

謹慎提供一些細節/解釋? – vyegorov 2014-10-13 09:11:28