Sql Oracle:从选择列表中选择

Sql Oracle:从选择列表中选择,sql,oracle,Sql,Oracle,这是我的Oracle 11g表: -------------------------- |MyTable | -------------------------- |UserID |Date | -------------------------- |1 |4/29/2011 | |1 |6/13/2013 | |2 |5/3/2001 | |2 |2/3/

这是我的Oracle 11g表:

--------------------------
|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,并获取包含最新日期及其userID的行。有没有办法从选择列表中进行选择?比如:

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

你还需要为此辩护吗?只需按日期说明订购,然后选择top userid

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

我想说,您的第一个查询应该更像:

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进行筛选。否则,您要做的是选择第一个检索到的行(无论是哪一行),然后对该行进行排序。另外请注意,ROWNUM通常不会像您预期的那样工作,除非您将筛选限制为小于,我认为您可以在不使用子查询的情况下执行此操作:

SELECT MAX(Date) AS upd_dt,
       MAX(UserID) keep(dense_rank last order by Date) as UserID
  FROM MyTable;
为了澄清这一部分:MAXUserID。考虑两行具有相同的最大日期和不同的用户ID。< /P>
所以你必须决定选哪一个。使用聚合的MAXUserID或MINUserID,您可以改变结果。

为什么不使用where rownum=1 order by upd_dt desc???@jcho360如果没有子查询,它将无法工作。我不想在子查询中这样做。一般来说,您可以使用查询来代替表名。在关系理论中,您总是可以做到这一点,但在实际实现中存在限制。查询的表、视图和结果集都是关系所指的关系。@jcho360据我所知,您必须在子查询内按顺序排列,在该子查询外按WHERE ROWNUM=1排列。否则在排序之前进行筛选。rownum是在排序之前分配的,因此必须有子查询。
--------------------------
|MyTable                 |
--------------------------
|UserID      Date        |
--------------------------
|1          |6/13/2013   |
|2          |6/13/2013   |
--------------------------