2013-12-18 83 views
0

这里是我的Oracle(11克)表:甲骨文:选择从选择

-------------------------- 
|MyTable     | 
-------------------------- 
|UserID |Date   | 
-------------------------- 
|1   |4/29/2011 | 
|1   |6/13/2013 | 
|2   |5/3/2001 | 
|2   |2/3/2011 | 
|3   |12/3/2009 | 
|3   |4/3/2011 | 
-------------------------- 

如果我执行下列SQL:

SELECT MAX(Date) AS upd_dt, UserID 
FROM MyTable 
GROUP BY upd_dt, UserID 

我得到:

-------------------------- 
|User ID |Date  | 
-------------------------- 
|1   |6/13/2013 | 
|2   |2/3/2011 | 
|3   |4/3/2011 | 
-------------------------- 

其中我理解。我现在想要对这些结果执行SELECT并获取最近日期和其用户标识的行。有没有办法从SELECT中选择?例如:

SELECT MAX(upd_dt) AS maxdt, UserID 
FROM ( 
     SELECT MAX(Date) AS upd_dt, UserID 
     FROM MyTable 
     GROUP BY upd_dt, UserID 
    ) 

GROUP BY maxdt, UserID 
+0

为什么不使用'where rownum = 1 order by upd_dt desc' ?? – jcho360

+0

@ jcho360如果没有子查询,它将无法正常工作 – gpeche

+0

我不是在子查询中进行说明 – jcho360

回答

1

我要说的是,你的第一个查询应该更像:

SELECT MAX(Date) AS upd_dt, UserID 
FROM MyTable 
GROUP BY UserID 

对于你的第二个查询,是的,你可以使用子查询。我认为你不需要汇总:

SELECT * 
FROM (  
    SELECT Date, UserID 
    FROM MyTable 
    ORDER BY Date dESC 
) 
WHERE ROWNUM < 2; 

请注意,您需要把ORDER BY查询,然后在查询ROWUM过滤。否则,你正在做的是第一个检索到的行(可能是哪个),然后是ORDER这个单行。还要注意的是ROWNUM将一般工作像您期望的,除非你限制过滤,小于(<

0

你甚至需要灌溉吗?只需按日期倒序并选择顶部的用户ID

select * from (select upd_dt, UserID from MyTable order by upd_dt desc) where rownum < 2 
+0

'rownum'是在订购前分配的,所以必须有子查询。 –

1

我觉得你可以不用子查询:

SELECT MAX(Date) AS upd_dt, 
     MAX(UserID) keep(dense_rank last order by Date) as UserID 
    FROM MyTable; 

为了澄清这一部分: MAX(UserID)。考虑有两行具有相同的最大Date和不同的UserID

-------------------------- 
|MyTable     | 
-------------------------- 
|UserID  Date  | 
-------------------------- 
|1   |6/13/2013 | 
|2   |6/13/2013 | 
-------------------------- 

所以你必须决定选择哪一个。用这个总计MAX(UserID)或者MIN(UserID)你可以改变结果。