我有一张带有图片的桌子和一张带有图片信息的桌子(例如:尺寸)。
**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
有关信息:可能有多个图像具有相同名称。
我想获取由name
,size
订购的图片的字段status
,changedate
,name
和status
以及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中做到这一点?
答案 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
,依此类推。