2015-02-11 68 views
1

我有一个表文档(id,name,id_expedient,creation_date,modify_date)。一个权宜之计可以有几个文件。 我有一个文件的ID,我想找到一个权宜之计,其最后一次修改(或创建)文件是我的Oracle SQL按照最新修改的行排序的SQL分组字段

选择例如

id name   id_expedient creation_date   modify_date 
---------------------------------------------------------------------- 
1 doc Monday  exp A   2/11/2015    
2 doc Tuesday  exp B   2/10/2015  
3 doc Friday  exp C   2/09/2015      
4 doc Thursday exp C   2/01/2015    2/08/2015 

如果我搜索文档ID之一:

1 the result must be Exp A 

2 the result must be Exp B 

3 the result must be Exp C 

4 the result must be void, because doc Thursday is not the lastest modified document of Exp C (that would be doc 3) 

我想这样做的子查询,但我不能获得有利的

SELECT id_exp 
from TB_DOCUMENT doc1 
where doc1.doc_id IN 
    (select TOP 1 DOC2.doc_id FROM 
     (SELECT DOC2.doc_id, NVL(MODIFY_DATE,CREATION_DATE) AS DateC 
     FROM TB_DOCUMENT DOC2 
     WHERE DOC2.id_exp = doc1.id_exp) 
    ORDER by DateC DESC) 
的最新的修改后的文档3210

任何想法?

谢谢

+2

如果您使用的是Oracle,你为什么有SQL Server语法在查询? – 2015-02-11 13:06:29

+2

这只是一个例子。甲骨文是我必须用来解决这个问题。 – 2015-02-11 13:13:07

+0

我想你也应该更好地阐明你的期望。 4不会返回任何内容,因为exp C的创建日期更近,ID 3? – mucio 2015-02-11 13:22:55

回答

2

试试这个:

select * 
    from TB_DOCUMENT t 
where (id_expedient, 
     coalesce(modify_date, 
       creation_date 
       ) 
     ) in (select id_expedient, 
        max(coalesce(modify_date, creation_date)) 
       from TB_DOCUMENT sub 
       where t.id_expedient = sub.id_expedient 
        group by id_expedient) 
    and t.id = YOUR_ID 

中的子查询的WHERE条件可以让你获得仅与最大值创建或修改日期为每个id_expedient行。

我在SQLFiddler中创建了一个演示。

+0

完美。这正是我所需要的。非常感谢你,你已经考虑过创建Fiddler演示了:) – 2015-02-11 15:18:15

0

如果我这样做是正确,你想返回一行对每个权宜之计

SELECT id_expedient 
    FROM (SELECT id_expedient, max(NVL(modify_date, creation_date)) 
    FROM document 
    GROUP BY id_expedient 
     ); 

http://sqlfiddle.com/#!4/53997f/15

+0

好的,对不起,这是我的错,在Oracle上加入agg不起作用,至少不像我那样。 SELECT id_expedient FROM(SELECT id_expedient,max(NVL(modify_date,creation_date)) FROM GROUP BY id_expedient );这应该做的 – Clevemayer 2015-02-11 14:41:41