2017-09-25 151 views
0

我有下面的表,并试图运行以下查询以获得最新的DEPTID根据EFFDT,这是第二行的 (DAA System Infrastructur 1/13/2017),但我仍然得到所有的记录。我在这里做错了什么?Oracle - Sql查询获取表中的最新记录

我确实看过类似的问题,但没有像我一样的问题。

select d.deptid,d.descr,d.effdt 
from SYSADM.PS_DEPT_TBL d 
inner join(select deptid,descr,max(to_date(effdt)) as max_date 
       from SYSADM.PS_DEPT_TBL 
       group by deptid, descr) d1 
on d.deptid = d1.deptid 
and to_date(effdt) = max_date 
where d.deptid ='DAA' 

这是表:

DEPTID DESCR     EFFDT 
------------------------------------------- 
DAA  Telecommunications  2/18/2013 
DAA  System Infrastructure   1/13/2017 
DAA  Manager, Telecommunications 1/1/1900 
DAA  System Infrastructure & Contrl 7/8/2013 
+0

可以颠倒顺序,并采取先用'LIMIT 1' – SubjectDelta

+1

'descr'不应该的一部分镂空表/内联视图,也不属于组的一部分。 – xQbert

回答

2

这是你的问题:

group by deptid, descr 

你的子查询包括在投影和分组descr,所以它会计算最大的有效日期为这两个列的每个组合。所以它返回四行,其中有四个不同的值max_date,这就是为什么你的最终结果就是它的原因。

解决方法很简单:

select d.deptid,d.descr,d.effdt 
from SYSADM.PS_DEPT_TBL d 
inner join(select deptid,max(to_date(effdt)) as max_date 
       from SYSADM.PS_DEPT_TBL 
       group by deptid) d1 
on d.deptid = d1.deptid 
and to_date(effdt) = max_date 
where d.deptid ='DAA' 
0
select * from(
    select * 
    from SYSADM.PS_DEPT_TBL 
    order by to_CHAR(EFFDT,'YYYY-MM-DD') desc 
) 
where ROWNUM <2; 

上面的查询将返回其拥有最新的日期值的行。

+0

你试过这个吗? –

+0

这并不能真正解决OP的问题:他们需要给定部门的最大日期。 – APC

+0

到JAX,并且需要在查询中使用desc而不是asc。 –

0

试试这个

SELECT * FROM (
    SELECT deptid, descr, effdt 
    FROM SYSADM.PS_DEPT_TBL 
    WHERE deptid = 'DAA' 
    ORDER BY effdt DESC 
) resultSet 
WHERE ROWNUM = 1; 
+0

为什么古怪的非Oracle语法? – APC

+0

因为我从没有看到甲骨文的年龄...我的错误是什么? – SubjectDelta

+1

文字使用单引号而不是双引号。标识符不使用反引号。 – APC