2014-01-07 36 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