2014-01-07 64 views
0

我有一個包含圖像的表格和一個包含圖像信息的表格(例如:大小)。Oracle 11g獲取不同的多行

**TABLE `images`** 
id | name | path | status  | changedate 
--------------------------------------------- 
1 | 1.tif | xxx/ | corrected | 2013/03/13 
2 | 1.tif | zzz/ | uncorrected | 2013/03/13 
3 | 1.tif | yyy/ | corrected | 2013/03/14 
4 | 2.tif | zzz/ | correct  | 2013/03/29 

**TABLE `imageinfo`** 
imageid | size 
------------------ 
1  | 100x200 
2  | 100x200 
3  | 100x200 
4  | 127x127 

有關信息:可能有超過1張圖像具有相同的名稱。

我想要得到的領域namesize,由namestatuschangedate(按此順序排列)下令圖像statuschangedate

正如你可以看到它有可能有超過1個同名的圖像。我只想要每name一行,第一行如果有重複的name圖像。

我已經有了:

SELECT 
    name, 
    size, 
    status, 
    changedate 
FROM images 
JOIN imageinfo ON images.id = imageinfo.imageid 
ORDER BY 
    name, 
    status, 
    changedate 

執行的輸出:

3 | 1.tif | 100x200 | corrected | 2013/03/14 
1 | 1.tif | 100x200 | corrected | 2013/03/13 
2 | 1.tif | 100x200 | uncorrected | 2013/03/13 
4 | 2.tif | 127x127 | correct  | 2013/03/29 

需要的輸出:

3 | 1.tif | 100x200 | corrected | 2013/03/14 
4 | 2.tif | 127x127 | correct  | 2013/03/29 

這裏的一個不同無法正常工作,這就是我已經想通了。 但是如何在Oracle中做到這一點?

+0

你可以添加你的執行輸出嗎? –

+0

當圖像'1.tif'與3種不同尺寸關聯時,您如何識別正確的圖像尺寸? –

+0

@MaheswaranRavisankar:增加了執行和預期的輸出。 – frgtv10

回答

4

可以使用row_number識別第一行,然後用它來過濾掉重複:

select name, size, status, changedate 
from (SELECT name, size, status, changedate, 
      row_number() over (partition by i.name order by i.changedate desc) as seqnum 
     FROM images i JOIN 
      imageinfo ii 
      ON i.id = ii.imageid 
    ) i 
where seqnum = 1 
order by name, status, changedate; 

編輯:

row_number()函數生成整數的從1開始的行的組的序列。行的組由partition by子句定義。因此,在這種情況下,每組具有相同i.name的行將重新開始編號。整數的順序基於order by子句。因此,在這種情況下,每個組中最近的更改日期取值爲1等等。

+1

根據用戶的新要求,通過i.name order by i.changedate desc進行分區,完成! –

+0

@MaheswaranRavisankar。 。 。謝謝你指出。獲得第一次出現似乎很奇怪,通常最近的更有趣。 –

+0

@GordonLinoff和@MaheshwaranRavisankar不應該是按分區 – SriniV