Oracle 11g获取多行的区别

时间:2014-01-07 16:02:43

标签: sql oracle oracle11g

我有一张带有图片的桌子和一张带有图片信息的桌子(例如:尺寸)。

**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

有关信息:可能有多个图像具有相同名称。

我想获取由namesize订购的图片的字段statuschangedatenamestatus以及changedate(按此顺序排序)。

正如您所看到的,可能存在多个具有相同名称的图像。我只需要每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中做到这一点?

1 个答案:

答案 0 :(得分: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,依此类推。